Хобрук: Ваш путь к мастерству в программировании

Докер предоставляет порты между контейнерами

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

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 в «веб-контейнере».

Любые идеи ?

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


Ответы:


1

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

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

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

Как свинг-трейдеры могут использовать ИИ для больших выигрышей
По мере того как все больше и больше профессиональных трейдеров и активных розничных трейдеров узнают о возможностях, которые предоставляет искусственный интеллект и машинное обучение для улучшения..

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

Обзор: Машинное обучение: классификация
Только что закончил третий курс курса 4 часть специализации по машинному обучению . Как и второй курс, он был посвящен низкоуровневой работе алгоритмов машинного обучения. Что касается..

Разработка расширений Qlik Sense с qExt
Использование современных инструментов веб-разработки для разработки крутых расширений Вы когда-нибудь хотели кнопку для установки переменной в приложении Qlik Sense? Когда-нибудь просили..

React Hooks: основы деструктуризации массива
Kent C. Dodds написал классный пост о том, как грядущая функция React под названием Hooks работает на капоте. Предстоящий хук React useState основан на деструктурировании массива, давайте..

Пакеты R, используемые в Tesla
Добро пожаловать обратно! R — очень популярный язык программирования, используемый множеством компаний, включая Tesla! Итак, давайте взглянем на некоторые пакеты R, которые использует Tesla...

Сокращение и слияние токенов для эффективных моделей VL: обзор
Часто в задачах, связанных с компьютерным зрением и НЛП, вычислительно затратная и требующая большого объема памяти обработка становится препятствием для более быстрого логического вывода модели, а..