Почему приложение Dockerized Rails вызывает "PG :: ConnectionBad"? - PullRequest
0 голосов
/ 03 января 2019

Я пытаюсь «докеризировать» существующее приложение для разработки Rails. Я впервые экспериментирую с Docker.

После поиска и чтения большого количества информации в Интернете, мне наконец-то удалось запустить контейнер с несколькими службами: app, postgres, redis, sidekiq и guard.

Но у меня проблемы с подключением к базе данных.

Starting postgres ... done
Starting redis    ... done
rails aborted!
PG::ConnectionBad: could not connect to server: Connection refused
    Is the server running on host "localhost" (127.0.0.1) and accepting
    TCP/IP connections on port 5432?
could not connect to server: Address not available
    Is the server running on host "localhost" (::1) and accepting
    TCP/IP connections on port 5432? 

Без сомнения, есть простая конфигурация, которую я пропустил, но я не смог выяснить, что или найти подходящее руководство.

Я заметил, что IP-адреса не совпадают.

$ docker-compose ps
Name                  State   Ports
------------------------------------------------------
postgres              Up      0.0.0.0:5432->5432/tcp

Верхняя ошибка предполагает, что postgres должен быть на 127.0.0.1. Может ли это быть причиной?

Кто-нибудь может указать мне правильное направление?

Dockerfile

# Dockerfile
FROM ruby:2.4-alpine

# Install runtime dependencies
RUN apk add --update --virtual runtime-deps postgresql-client nodejs libffi-dev readline-dev yarn git

RUN apk add --virtual build-deps build-base postgresql-dev libc-dev linux-headers libxml2-dev libxslt-dev readline-dev git 

# Copy the app's code into the container
ENV APP_HOME /app
COPY . $APP_HOME
WORKDIR $APP_HOME

# Budnle gems
RUN bundle install --jobs 4

# Install Yarn packages
RUN yarn install
RUN yarn upgrade

# Configure production environment variables
ENV RAILS_ENV=production \
    RACK_ENV=production

# Expose port 3000 from the container
EXPOSE 3000

# Run puma server
CMD ["bundle", "exec", "puma", "-C", "config/puma.rb"]

докер-compose.yml

version: '3'

services:
  postgres:
    container_name: postgres
    ports:
      - "5432:5432"
    volumes:
      - $HOME/postgres-data:/var/lib/postgresql
    image: postgres:9.6.9

  redis:
    container_name: redis
    ports:
      - "6379:6379"
    links:
      - postgres
    image: redis:5.0-rc

  web:
    container_name: web
    build: .
    ports:
      - "3000:3000"
    command: /bin/sh -c "rails s -b 0.0.0.0 -p 3000"
    env_file:
      - .env
    links:
      - postgres
      - redis

  guard:
    build: .
    env_file:
      - .env
    command: bundle exec guard --no-bundler-warning --no-interactions

  sidekiq:
    build: .
    command: bundle exec sidekiq -C config/sidekiq.yml
    links:
      - postgres
      - redis
    env_file:
      - .env

volumes:
  redis:
  postgres:
  sidekiq:
  guard:

1 Ответ

0 голосов
/ 03 января 2019

Так как вы используете официальный док-контейнер postgres, официальная документация имеет некоторую связанную информацию:

The PostgreSQL image sets up trust authentication locally so you may 
notice a password is not required when connecting from localhost 
(inside the same container). However, a password will be required 
if connecting from a different host/container.

Поскольку вы находитесь не в одном контейнере, похоже, вам может понадобиться использовать POSTGRES_USER и POSTGRES_PASSWORD. Я проверил это локально с примером приложения, используя ваши docker-compose.yml и Dockerfile, и мне нужно было:

  • Добавьте POSTGRES_USER и POSTGRES_PASSWORD к обеим секциям web и postgres в соответствующих env / environment (вы добавите их к включаемому файлу .env)
  • Добавьте username и password ключи к database.yml в соответствующих разделах, чтобы получить переменные окружения, которые я установил выше

database.yml

default: &default
  adapter: postgresql
  encoding: unicode
  host: postgres
  pool: 5
  timeout: 5000
  username: <%= ENV["POSTGRES_USER"] %>
  password: <%= ENV["POSTGRES_PASSWORD"] %>

С этими изменениями я смог подключиться к контейнеру / базе данных postgres из веб-контейнера.

Мой docker-compose ps показывает похожие на ваши:

   Name                      Command                State             Ports
----------------------------------------------------------------------------------------
hello_app_sidekiq_1   bundle exec sidekiq -C con ...   Exit 127
postgres              docker-entrypoint.sh postgres    Up         0.0.0.0:5432->5432/tcp
redis                 docker-entrypoint.sh redis ...   Up         0.0.0.0:6379->6379/tcp
web                   /bin/sh -c bundle exec rai ...   Up         0.0.0.0:3000->3000/tcp

Я могу запустить docker-compose run --rm web /bin/ash и перейти на rails console, запустить rails db:migrate и т. Д. Без проблем с изменениями выше.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...