Docker compose с Rails и Postgres не удалось подключиться к серверу: нет маршрута к хосту — сервер

#ruby-on-rails #postgresql #docker #docker-compose

#ruby-on-rails #postgresql #docker #docker-compose

Вопрос:

В настоящее время у меня возникла проблема с моим docker-compose, в котором есть эти службы. Приложение Rails и Postgres. Это мои конфигурации:

docker-compose.yml

 version: '3'
services:
 db:
  image: postgres:alpine
  restart: always
  volumes:
   - ./tmp/db:/var/lib/postgresql/data
  ports:
    - "5432:5432"
  environment:
    - POSTGRES_USER=postgres
    - POSTGRES_PASSWORD=postgres
  
 app:
  build: .
  restart: always
  command: bash -c "rm -f tmp/pids/server.pid amp;amp; rails s -p 3000 -b '0.0.0.0'"
  volumes:
   - .:/myapp
   - bundle_path:/bundle
  ports:
   - "3000:3000"
  depends_on:
   - db

volumes:
  bundle_path:

 

Dockerfile

 FROM ruby:2.5.3-slim

# install rails dependencies
RUN apt-get update -qq 
  amp;amp; apt-get install -y 
  # Needed for certain gems
  build-essential 
  # Needed for postgres gem
  libpq-dev 
  # Others
  nodejs 
  vim-tiny    
  # The following are used to trim down the size of the image by removing unneeded data
  amp;amp; apt-get clean autoclean 
  amp;amp; apt-get autoremove -y 
  amp;amp; rm -rf 
  /var/lib/apt 
  /var/lib/dpkg 
  /var/lib/cache 
  /var/lib/log

# Changes localtime to Singapore
RUN cp /usr/share/zoneinfo/Asia/Singapore /etc/localtime

# create a folder /myapp in the docker container and go into that folder
RUN mkdir /myapp

WORKDIR /myapp

COPY Gemfile /myapp/Gemfile

COPY Gemfile.lock /myapp/Gemfile.lock

# Run bundle install to install gems inside the gemfile
RUN bundle install

ADD . /myapp

CMD bash -c "rm -f tmp/pids/server.pid amp;amp; rails s -p 3000 -b '0.0.0.0'"
 

database.yml

 default: amp;default
  adapter: postgresql
  encoding: unicode
  pool: <%= ENV.fetch("RAILS_MAX_THREADS") { 5 } %>

development:
  <<: *default
  database: myapp_development
  host: db
  username: postgres
  password: postgres
  port: 5432
  
 

Я могу создать приложение, используя docker-compose build but всякий раз, когда я docker-compose up db завершаю работу службы, но мои рельсы app запущены.

Это журналы, которые я получаю при запуске docker-compose up

 db_1   | The files belonging to this database system will be owned by user "postgres".
db_1   | This user must also own the server process.
db_1   |
db_1   | The database cluster will be initialized with locale "en_US.utf8".
db_1   | The default database encoding has accordingly been set to "UTF8".
db_1   | The default text search configuration will be set to "english".
db_1   |
db_1   | Data page checksums are disabled.
db_1   |
db_1   | initdb: error: directory "/var/lib/postgresql/data" exists but is not empty
db_1   | If you want to create a new database system, either remove or empty
db_1   | the directory "/var/lib/postgresql/data" or run initdb
db_1   | with an argument other than "/var/lib/postgresql/data".
 

Ошибка, которую я получаю при доступе http://localhost:3000 является

 could not connect to server: No route to host Is the server running on host "db" (172.18.0.2) and accepting TCP/IP connections on port 5432?
 

Ответ №1:

Я думаю, вам также следует использовать volume для Postgres.

 services:
  db:
    image: postgres:alpine
    restart: always
    volumes:
     - postgres_volume:/var/lib/postgresql/data
volumes:
  postgres_volume:
 

У меня была аналогичная проблема, и я исправил ее этим. Попробуйте также перезапустить Docker.

Комментарии:

1. Сейчас это работает. Интересно, что касается моего другого приложения rails, которое использует docker-compose, мне не нужно монтировать объем postgres, и он работает. Не уверен, что для этого это необходимо.

2. Честно говоря, я не знаю, но я потратил некоторое время на проблемы с объемом, особенно с Postgres. Возможно, это плохая конфигурация с моей стороны, но я так и не понял, почему / как.