#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. Возможно, это плохая конфигурация с моей стороны, но я так и не понял, почему / как.