#postgresql #docker #docker-compose #psql
#postgresql #docker #docker-составить #psql
Вопрос:
У меня возникли проблемы с подключением postgresDB к моему приложению с помощью docker-compose
Мое понимание docker compose заключается в том, что я могу объединить два контейнера, чтобы они могли взаимодействовать друг с другом. Предположим, у меня есть приложение в app
контейнере, которое запускает команду psql (просто однострочный скрипт python с os.command("psql")
). Поскольку в app
контейнере не установлен postgres, он не сможет запускать psql самостоятельно. Однако я думал, что объединение двух контейнеров в docker-compose.yml позволит мне запустить psql, но, по-видимому, нет.
Чего мне здесь не хватает?
Я использую 2 изображения postgres, потому что пытаюсь найти ошибки регрессии между двумя СУБД
version: "3"
services:
app:
image: "app:1.0"
depends_on:
- postgres9
- postgres12
ports:
- 8080:80
postgres9:
image: postgres:9.6
environment:
POSTGRES_PASSWORD: mysecretpassword
POSTGRES_USER: postgres
POSTGRES_DB: test_bd
ports:
- '5432:5432'
postgres12:
image: postgres:12
environment:
POSTGRES_PASSWORD: mysecretpassword
POSTGRES_USER: postgres
POSTGRES_DB: test_bd
ports:
- '5435:5435'
Комментарии:
1. Из
app
контейнера вы должны быть в состоянииtelnet postgres9 5432
. Что вы получаете?
Ответ №1:
Каждый контейнер Docker имеет автономную файловую систему. Вы никогда не сможете напрямую запускать команды с хоста или из файловых систем других контейнеров; все, что вы хотите запустить, должно быть установлено в контейнере (на самом деле, в Dockerfile его образа).
Если вы хотите запустить инструмент, подобный psql
, он должен быть установлен в вашем образе. Вы не говорите, какой у вас базовый образ, но если он основан на Debian или Ubuntu, вам необходимо установить postgresql-client
пакет:
RUN apt-get update
amp;amp; DEBIAN_FRONTEND=noninteractive
apt-get install --no-install-recommends --assume-yes
postgresql-client
Правильный подход здесь заключается в добавлении стандартной клиентской библиотеки PostgreSQL на Python, такой как psycopg2, в Python вашего проекта Pipfile
, setup.py
и / или requirements.txt
и использовании этой библиотеки вместо того, чтобы использовать psql
. Для установки этого пакета вам также понадобятся заголовочные файлы библиотеки PostgreSQL C; вместо этого postgresql-client
установите пакет Debian libpq-dev
.
Ответ №2:
В вашем случае эти два контейнера с экземпляром postgres в каждом запущены на разных хостах (кроме хоста с app
). Что вам нужно, так это указать правильный хост в psql
команде. Это может выглядеть как (для контейнера postgres12):
PGPASSWORD="mysecretpassword" psql -h postgres12 -d test_bd -U postgres