Docker выставить порты между контейнерами - PullRequest
1 голос
/ 18 марта 2020

Я хотел бы иметь приложение python flask, которое работает с базой данных postgresql (psycopg2). Итак, я сделал этот docker -компонентный файл:

version: "3"
services:
  web:
    depends_on:
      - database
    container_name: web
    build:
      context: "."
      dockerfile: "docker/Dockerfile.web"
    ports:
      - 5000:5000
    volumes:
      - database:/var/run/postgresql
  database:
    container_name: database
    environment:
      POSTGRES_PASSWORD: "password"
      POSTGRES_USER: "user"
      POSTGRES_DB: "products"
    image: postgres
    expose:
    - 5432
    volumes:
    - database:/var/run/postgresql
volumes:
  database:

В моем app.py я пытаюсь подключиться к postgres следующим образом:

conn = psycopg2.connect(database="products", user="user", password="password", host="database", port="5432")

Когда я запускаю docker-compose up Я получаю следующую ошибку:
" Сервер работает на хосте" база данных "(172.21.0.2) и принимает соединения TCP / IP через порт 5432? "

Не знаю Не знаю, где я ошибся здесь.

  • Контейнерная "база данных" предоставляет свой порт 5432.
  • Оба контейнера находятся в одной сети, которая называется "web_app_default".
  • Файл сокета существует в каталоге /var/run/postgresql в контейнере "web".

Есть идеи?

Спасибо за ответы и хорошего дня.

1 Ответ

2 голосов
/ 18 марта 2020

Я думаю, что случилось то, что, хотя у вас установлен флаг depends_on на database, это означает только то, что контейнер web запустится после запуска контейнера database. Однако в первый раз для установки базы данных обычно требуется довольно много времени, и когда ваш сервер web запущен, база данных все еще не готова принять соединение.

2 способа обойти эту проблему проблема здесь:

  1. Простой способ без изменения кода: запустите docker-compose up -d (режим detach) и дождитесь окончания инициализации базы данных sh. Затем снова запустите docker-compose up -d, и ваш контейнер web сможет подключиться к базе данных.
  2. Второй способ - обновить контейнер web с помощью restart: always, поэтому docker-compose будет пытаться продолжить перезапустите контейнер web, пока он не будет успешно запущен (пока база данных не будет готова принять соединение)
version: "3"
services:
  web:
    depends_on:
      - database
    ...
    restart: always
    ...
...