Docker, Rails, Postgres - служба БД не найдена - PullRequest
0 голосов
/ 04 июля 2019

Dockerfile

FROM ruby:2.6.3
RUN apt-get update -qq && apt-get install -y nodejs postgresql-client
RUN mkdir /paper_scammer_docker
WORKDIR /paper_scammer_docker
COPY Gemfile /paper_scammer_docker/Gemfile
COPY Gemfile.lock /paper_scammer_docker/Gemfile.lock
RUN bundle install
COPY . /paper_scammer_docker

# Add a script to be executed every time the container starts.
COPY entrypoint.sh /usr/bin/
RUN chmod +x /usr/bin/entrypoint.sh
ENTRYPOINT ["entrypoint.sh"]
EXPOSE 3000

# Start the main process.
CMD ["rails", "server", "-b", "0.0.0.0"]

docker-compose.yml

version: '3'
services:
  db:
    image: postgres:10
    ports:
      - "5432:5432"
    volumes:
      - ./tmp/db:/var/lib/postgresql/data
  web:
    build: .
    command: bash -c "rm -f tmp/pids/server.pid && bundle exec rails s -p 3000 -b '0.0.0.0'"
    volumes:
      - .:/paper_scammer_docker
    ports:
      - "3000:3000"
    links:
      - "db:db"
    depends_on:
      - db

Я успешно могу создать образ с помощью следующей команды

docker-compose build

Если я это сделаюdocker-compose up в корневом каталоге проекта мое приложение работает нормально, и я могу видеть два контейнера, один для моего приложения rails, а другой для postgres, когда я делаю docker container ls.Я заметил, что изображение postgres загружается из библиотеки.

файл database.yml

# SQLite version 3.x
#   gem install sqlite3
#
#   Ensure the SQLite 3 gem is defined in your Gemfile
#   gem 'sqlite3'
#
default: &default
  adapter: postgresql
  encoding: unicode
  pool: <%= ENV.fetch("RAILS_MAX_THREADS") { 5 } %>
  timeout: 5000
  host: db
  username: postgres
  password:
  # user: gnpsllco_papaer
  # password: sharma@123

development:
  <<: *default
  database: paper_scammer_development
  # user: postgres
  # password: sharma@123

# Warning: The database defined as "test" will be erased and
# re-generated from your development database when you run "rake".
# Do not set this db to the same as development or production.
test:
  <<: *default
  database: paper_scammer_test
  # user: postgres
  # password: sharma@123

production:
  <<: *default
  database: gnpsllco_paper_scammer

Проблема

Я запускаю следующую команду, чтобы запустить Dockerконтейнер из образа моего приложения rails.

sudo docker run -p 3000:3000 paperscammer_web

контейнер postgres не запущен или отсутствует.

Я хочу понять, как этот dockerfile-compose обрабатывает это, когда я вращаю изображениеПриложение rails, которое говорит, что зависит от службы postgres, не должно ли оно также вращать контейнер postgres и устанавливать 'db' в качестве хоста для соединений.

, или же его нужно вращать вручную для postgres.

Я получаю следующую ошибку при запуске http://localhost:3000

could not translate host name "db" to address: Name or service not known

Я вижу, что контейнер postgres не работает.

Спасибо

Ответы [ 2 ]

2 голосов
/ 04 июля 2019

sudo docker run -p 3000:3000 paperscammer_web запустит только веб-сервер, вам нужно запустить docker-compose:

sudo docker-compose up -d --build

второй вариант:

 sudo docker run --name db -p 5432:5432 -v ./tmp/db:/var/lib/postgresql/data postgres:10
 sudo docker run -p 3000:3000 --link db:db -v .:/paper_scammer_docker paperscammer_web
1 голос
/ 04 июля 2019

docker-compose up и docker run - разные команды.Использование последнего не будет использовать файл compose, только параметры, переданные команде.

Когда вы используете docker run, вы должны указать, какие контейнеры вы хотите запускать специально, если вы хотите запустить оба db и web вы должны использовать эту команду дважды.

С другой стороны, когда вы используете docker-compose up, вы запускаете все контейнеры, указанные в docker-compose.yml со всеми его параметрами.

Кроме того, свойство depends_on просто указывает, что контейнерweb будет запущен после успешного запуска контейнера db.

В качестве последнего замечания, если вы хотите, чтобы ваши контейнеры могли взаимодействовать друг с другом, вы должны добавить сеть в файл compose:

version: '3'
services:
  db:
    image: postgres:10
    container_name: db
    ports:
      - "5432:5432"
    volumes:
      - ./tmp/db:/var/lib/postgresql/data
    networks:
      - my-network-name

  web:
    build: .
    container_name: web
    command: bash -c "rm -f tmp/pids/server.pid && bundle exec rails s -p 3000 -b '0.0.0.0'"
    volumes:
      - .:/paper_scammer_docker
    ports:
      - "3000:3000"
    links:
      - "db:db"
    depends_on:
      - db
    networks:
      - my-network-name

networks:
  my-network-name:
    driver: bridge

Также рекомендуется добавить container_name для ссылки на них.

С опциями thoose теперь контейнеры могут связываться со своими именами в виде IP-адресов / имен хостов:

http://<container_name>:<port>

Например, контейнер web сможет подключаться к базе данных в контейнере db следующим образом:

http://db:5432/gnpsllco_paper_scammer

Обратите внимание, что IP / имя хоста теперь является именем контейнера.

Как указал @LinSel, вы можете собрать и запустить все контейнеры с помощью команды (sudo не требуется):

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