docker-compose с двумя контейнерами: веб не может подключиться к БД - PullRequest
0 голосов
/ 24 января 2019

docker-compose не может создать веб-компонент, поскольку он не может подключиться к ранее созданному компоненту db

Mac OSX 10.13.6, conda 4.5.11, Python 3.6.8, Docker версия 18.09.1,docker-compose версия 1.23.2

django 1.8.3 устанавливается вместе с файл require.txt из Dockerfile.Не свободен в обновлении.

Несколько очень похожих обсуждений по SO не помогли (как этот: Docker-compose с django не смог перевести имя хоста "db" в адрес: имя или служба неизвестна).

У меня есть docker-compose.yml с сетью и двумя компонентами:

version: '3'
networks:
  bridge:
   driver: bridge
services:
  db:
    image: postgres:10
    container_name: myapp-db
    volumes:
      - ./postgres_data:/var/lib/postgresql/data/
    ports:
      - "5432:5432"
    environment:
     POSTGRES_DB: actionability-master
     POSTGRES_PASSWORD: postgres
     POSTGRES_USER: postgres
    networks:
      - bridge


  web:
    restart: unless-stopped
    container_name: myapp-web
    build: .
    command: /start_gunicorn.sh
    ports:
      - "8080:8080"
    environment:
      PRODUCTION: 'true'
    networks:
      - bridge

В моем settings.py У меня есть раздел БАЗ ДАННЫХ:

DATABASES = {
    'default': {
        'ENGINE': 'django.db.backends.postgresql_psycopg2',
        'NAME': INSTANCE_NAME,
        'USER': 'postgres',
        'PASSWORD': 'postgres',
        'HOST': 'db',
        'PORT': '5432'
    },

}

Когда я запускаю $ docker-compose up -d, создается первое изображение (дБ) и запускается его контейнер.Можно увидеть, что он работает и прослушивает порт 5432 с docker ps и lsof.То же самое происходит, если я удаляю web: компонент из docker-compose.yml file

Теперь у второго компонента (web) есть Dockerfile, который содержит эти две строки (среди многих других):

RUN python manage.py makemigrations myapp
RUN python manage.py migrate

"мигрировать" как умирает с этой ошибкой:

Traceback (most recent call last):
File "/usr/local/lib/python3.6/site-packages/django/db/backends/base/base.py", line 130, in ensure_connection
    self.connect()
File "/usr/local/lib/python3.6/site-packages/django/db/backends/base/base.py", line 119, in connect
    self.connection = self.get_new_connection(conn_params)
File "/usr/local/lib/python3.6/site-packages/django/db/backends/postgresql_psycopg2/base.py", line 176, in get_new_connection
    connection = Database.connect(**conn_params)
File "/usr/local/lib/python3.6/site-packages/psycopg2/__init__.py", line 130, in connect
    conn = _connect(dsn, connection_factory=connection_factory, **kwasync)
psycopg2.OperationalError: could not connect to server: Connection refused
Is the server running on host "db" (37.34.32.51) and accepting TCP/IP connections on port 5432?

Я устал от нескольких твиков.* изменено version '3.7' * добавлено в раздел БД

expose:
    - "5432"
  • добавлено в веб-компонент:

depends_on: - "db"

  • добавлено ввеб-компонент:

links: - "db"

  • установить для PRODUCTION значение false

environment: PRODUCTION: 'false'

  • измененоHOST в settings.py для имени контейнера, имени изображения, тегов, идентификатора контейнера, «localhost», «127.0.0.1» и т. Д. Ошибка та же, просто упоминание нового имени HOST вместо 'db '
  • побежал за пределы conda env
  • побежал с переключателем --build (docker-compose up -d --build)
  • did docker system prune и снова побежал

Все та же ошибка.


ОБНОВЛЕНИЕ: После предложения, что это docker-compose не работает таким образом, я попытался разделить его на две отдельные задачи.Сначала я создаю контейнер myapp-db и проверяю, что он работает на правильном порту:

$ docker container ps


CONTAINER ID        IMAGE               COMMAND                  CREATED             STATUS              PORTS                      NAMES
c110e8361cda        postgres:10         "docker-entrypoint.s…"   4 hours ago         Up 4 hours          0.0.0.0:5432->5432/tcp     myapp-db

Затем я собираю myapp-web:

docker build -t myapp-web .

По-прежнему происходит та же ошибка.Итак, почему он не находит контейнер БД СЕЙЧАС?

Ответы [ 3 ]

0 голосов
/ 11 марта 2019

Я использую список depends_on для запуска контейнера db перед веб-контейнером и links для обеспечения возможности разрешения имен хостов.

Я добавляю в сеть следующее:

services:
  db:
    # ...
  web:
    links:
    - "db:db" # resolve the hostname "db" with the ip of the db container
    depends_on:
    - db # start db before web

Пример

0 голосов
/ 13 марта 2019

Вы можете попробовать эту конфигурацию с псевдонимами сети.

version: '3.5'
services:

  db:
    image: postgres:10
    container_name: myapp-db
    volumes:
      - ./postgres_data:/var/lib/postgresql/data/
    expose:
      - "5432"
    environment:
       POSTGRES_DB: actionability-master
       POSTGRES_PASSWORD: postgres
       POSTGRES_USER: postgres
    networks:
      services-network:
        aliases:
         - db

  web:
    restart: unless-stopped
    container_name: myapp-web
    build: .
    command: /start_gunicorn.sh
    ports:
      - "8080:8080"
    environment:
      PRODUCTION: 'true'
    depends_on:
      - db
    networks:
      services-network:
        aliases:
         - web

networks:
   services-network:
     name: services-network
     driver: bridge
0 голосов
/ 24 января 2019

Я знаю, что это может показаться очень простым, но почему бы не рассмотреть немного более сложное соглашение об именах, а затем просто добавить эти имена в службу DNS на хосте или, по крайней мере, в записи A?

Тогда система сможет обращаться к базе данных по имени или по IP. Просто мысль.

Отличный выбор и сочетание платформы и языков, между прочим, Django + PostgreSQL - мой любимый. Я бы также рекомендовал Bootstrap, особенно если вы ищете возможности быстрого развертывания инструментов.

...