Docker撰写ruby + postgres - 无法连接到postgres

时间:2017-07-04 09:27:12

标签: ruby postgresql docker

我从official docker compose website创建了来自ruby的Dockerfile。我用docker compose将它与postgres集成在一起。当docker-compose up,然后postgresql启动但我无法连接到此。主要问题是在ruby数据库配置中,因为我无法更改为侦听其他主机并设置默认用户。我不知道如何在没有更改ruby数据库配置的情况下连接这两个容器。

Dockerfile

FROM ruby:2.3.4
RUN apt-get update -qq && apt-get install -y build-essential libpq-dev nodejs
RUN mkdir /myapp
WORKDIR /myapp
ADD Gemfile /myapp/Gemfile
ADD Gemfile.lock /myapp/Gemfile.lock
RUN bundle install
ADD . /myapp

多克尔-撰写

version: '3'
services:
  db:
    image: postgres:9.6
    ports:
      - "5432:5432"
  web:
    build: .
    ports:
      - "4000:4000"
    depends_on:
      - db

Ruby database.yml

default: &default
  adapter: postgresql
  encoding: unicode
  pool: 5

development:
  <<: *default
  database: project_development

如果我在web conatiner中运行&#34;捆绑exec rake db:create我得到错误:

psql: could not connect to server: No such file or directory
Is the server running locally and accepting
connections on Unix domain socket "/var/run/postgresql/.s.PGSQL.5432"?

我不知道将连接在一起的env集。

3 个答案:

答案 0 :(得分:3)

您没有在database.yml中指定数据库主机。将其设置为db或只是尝试此database.yml

development: &default
  adapter: postgresql
  encoding: unicode
  database: project_development
  pool: 5
  username: postgres
  password:
  host: db

test:
  <<: *default
  database: project_test

答案 1 :(得分:1)

您应该使用以下内容更新database.yml:

  database: ENV['DB_NAME']
  username: ENV['DB_USERNAME']
  password: ENV['DB_PASSWORD']

没有“默认PG用户”这样的东西,所以你必须用适当的权限创建自己的用户。

因此,一旦在容器内创建了PG用户,就可以使用正确的数据库设置更新docker-compose.yml文件:

web:
  environment:
    - DB_NAME=rails_development
    - DB_USERNAME=rails_user
    - DB_PASSWORD=rails_password

此外,您可能希望在docker-compose.yml中安装postgres的本地存储,以便在容器重新启动时保留数据:

volumes:
  - /var/lib/postgresql/data

答案 2 :(得分:1)

只需添加到Bartosz Bonisławski's answer

Ubuntu 18.04上构建 Rails 应用程序时,我遇到了此问题。

我的Dockerfile环境的development位于项目的docker/development/Dockerfile目录中,定义如下:

version: '3'

services:
  app:
    build:
      context: .
      dockerfile: ./docker/${RAILS_ENV}/Dockerfile
    depends_on:
      - database
      - redis
    ports:
      - "3000:3000"
    restart: always
    volumes:
      - .:/app
      - gem-cache:/usr/local/bundle/gems
      - node-modules:/app/node_modules
    env_file:
      - .env
    environment:
      RAILS_ENV: ${RAILS_ENV}
      RACK_ENV: ${RACK_ENV}

  database:
    image: postgres:12.1
    expose:
      - "5432"
    restart: always
    env_file:
      - .env
    environment:
      POSTGRES_USER: ${DATABASE_USER}
      POSTGRES_PASSWORD: ${DATABASE_PASSWORD}
      POSTGRES_DB: ${DATABASE_NAME}
      POSTGRES_HOST_AUTH_METHOD: ${DATABASE_HOST}

    volumes:
      - postgres-data:/var/lib/postgresql/data
volumes:
  gem-cache:
    driver: local
  node-modules:
    driver: local
  postgres-data:
    driver: local

我的.env文件被定义为:

DATABASE_USER=myapp_user
DATABASE_PASSWORD=myapp_password
DATABASE_NAME=myapp_development
DATABASE_HOST=database
DATABASE_PORT=5432

RAILS_ENV=development
RACK_ENV=development

我遇到的问题是我没有将host配置添加到项目的database.yml文件中。所以我遇到了错误:

psql:无法连接到服务器:没有这样的文件或目录 服务器是否在本地运行并接受 Unix域套接字“ /var/run/postgresql/.s.PGSQL.5432”上连接?

这是我的解决方法

我只是这样添加它,并且效果很好:

default: &default
  adapter: postgresql
  encoding: unicode
  # For details on connection pooling, see Rails configuration guide
  # https://guides.rubyonrails.org/configuring.html#database-pooling
  pool: <%= ENV.fetch("RAILS_MAX_THREADS") { 5 } %>

development:
  <<: *default
  database: <%= ENV['DATABASE_NAME'] %>
  username: <%= ENV['DATABASE_USER'] %>
  password: <%= ENV['DATABASE_PASSWORD'] %>
  host: <%= ENV['DATABASE_HOST'] %>
  port: <%= ENV['DATABASE_PORT'] %>

仅此而已。

我希望这会有所帮助