Запуск команды psql из контейнера docker

#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