Я пытаюсь «докеризировать» существующее приложение для разработки 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: