【问题标题】:Docker: Docker-compose ruby + postgres - PG::ConnectionBadcould not connect to serverDocker:Docker-compose ruby​​ + postgres - PG::ConnectionBadcould not connect to server
【发布时间】:2017-12-07 16:43:46
【问题描述】:

我从official docker-compose website 创建了 Dockerfile 到 ruby​​。我使用 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

Docker 编写

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

Ruby 数据库.yml

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

development:
  <<: *default
  database: project_development

如果我在 web conatiner "bundle 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"?

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

【问题讨论】:

    标签: ruby-on-rails ruby postgresql docker


    【解决方案1】:

    您没有在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
    

    【讨论】:

    • 我使用了类似的 database.yml,一切正常,但我无法更改 database.yml。所以这个解决方案不能解决问题。我不知道我必须在 docker config 中添加什么,这将有助于连接。
    • 非常感谢您。它为我减轻了很多压力。我的hostdatabase,但我的database.yml 文件中没有定义host。定义后,一切正常。
    【解决方案2】:

    您应该使用以下内容更新您的 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
    

    【讨论】:

    • postgres 的 docker 镜像中有默认用户名为postgres,密码为空,所以你不必创建它。您的解决方案不能解决问题作者提到的问题
    【解决方案3】:

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

    我在 Ubuntu 18.04 上构建 Rails 应用程序时遇到了这个问题。

    我的development 环境位于我的项目的docker/development/Dockerfile 目录中的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'] %>
    

    就是这样。

    我希望这会有所帮助

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2021-08-11
      • 2020-12-07
      • 2018-02-16
      • 2017-12-05
      • 2020-11-17
      • 2013-10-06
      • 2020-02-06
      • 1970-01-01
      相关资源
      最近更新 更多