Docker:Docker-compose Ruby + Postgres - PG :: ConnectionBad无法连接到服务器。

3
我创建了一个Dockerfile,用于从官方docker-compose网站导入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-compose
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 容器内运行 "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"?

我不知道应该设置哪个环境变量来连接在一起。
3个回答

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

我使用了类似的database.yml文件,一切都正常,但是我无法更改database.yml文件。因此,这个解决方案并没有解决问题。我不知道我必须在docker配置中添加什么,才能帮助连接。 - Michał Niedziela
非常感谢您的帮助,这让我省去了很多压力。我的 hostdatabase,但是在我的 database.yml 文件中没有定义 host。在定义后,一切都正常工作了。 - Promise Preston

1

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

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

没有所谓的“默认PG用户”,因此您需要创建自己的用户并赋予适当的权限。

因此,一旦在容器内创建了PG用户,您可以使用正确的DB设置更新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

1
在Postgres的Docker镜像中有一个名为postgres的默认用户,密码为空,因此您不必创建它。您的解决方案并未解决问题的提问者所提到的问题。 - Bartosz Bonisławski

1

补充Bartosz Bonisławski的回答

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

我的Dockerfile位于项目中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

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

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'] %>

那就这样吧。

希望这有所帮助


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接