Невозможно подключиться к postgres в контейнере Docker вне оболочки Python - PullRequest
0 голосов
/ 03 февраля 2019

Я не могу подключиться к образу Postgres в контейнере Docker вне оболочки Python.

У меня есть скрипт, который загружает и выкатывает образ Postgres Docker.Одним из шагов является то, что я хотел бы создать несколько таблиц в базе данных.

Если я запускаю setup.py, он загрузит образ и установит контейнер Docker на локальный компьютер и будет ожидать подключения.Если в следующий раз я открою оболочку Python и попытаюсь подключиться к БД - все отлично работает.

Мой Dockerfile:

FROM postgres:11.1
RUN apt-get update
EXPOSE 5432
ENV POSTGRES_DB monitoring
ENV POSTGRES_USER process_monitor

Мой setup.py файл:

import subprocess
import psycopg2


def update_apt():
    subprocess.run(['sudo', 'apt-get', '-y', 'update'])

def install_docker():
    subprocess.run(['sudo', 'apt-get', '-y', 'install', 'docker.io'])

def install_docker_image():
    subprocess.run(['sudo','docker', 'build', '-t', 'postgres-image', '.'])

def docker_run():
    subprocess.run(['sudo', 'docker', 'run', '-p', '5432:5432', '-v', '/var/run/postgresql:/var/run/postgresql', '-d', 'postgres-image'])


if __name__ == "__main__":
    update_apt()
    install_docker()
    install_docker_image()
    docker_run()

Вот что у меня есть в cli, когда я запускаю это:

Successfully built d7a66c60b43e
Successfully tagged postgres-image:latest
2d1c667a84513943dad359b73962b6314590b1bf79ab4376aa7b513684629e5f

--- Successul built and ran container ---

(venv) simon@simon-HP-EliteBook-840-G2:~/Desktop/Projects/x5-test-task$ sudo docker ps
CONTAINER ID        IMAGE               COMMAND                  CREATED             STATUS              PORTS                    NAMES
2d1c667a8451        postgres-image      "docker-entrypoint.s…"   7 seconds ago       Up 5 seconds        0.0.0.0:5432->5432/tcp   loving_shtern

-- Check if it works ----

(venv) simon@simon-HP-EliteBook-840-G2:~/Desktop/Projects/x5-test-task$ python3
Python 3.6.7 (default, Oct 22 2018, 11:32:17)
[GCC 8.2.0] on linux
Type "help", "copyright", "credits" or "license" for more information.
>>> import psycopg2
>>> conn = psycopg2.connect(dbname='monitoring', user='process_monitor')
>>> cur = conn.cursor()
>>> cur.execute('SELECT datname FROM pg_database')
>>> cur.fetchall()
[('postgres',), ('monitoring',), ('template1',), ('template0',)]
>>> exit()

--- as you can see, there is a monitoring database I need ---

Видите, успешное соединение из оболочки Python.

Но когда я попытался добавить тот же код, япроверил в оболочке, я получаю сообщение об ошибке:

if __name__ == "__main__":
    update_apt()
    install_docker()
    install_docker_image()
    docker_run()
    conn = psycopg2.connect(dbname='monitoring', user='process_monitor')
Traceback (most recent call last):
  File "setup.py", line 58, in <module>
    conn = psycopg2.connect(dbname='monitoring', user='process_monitor')
  File "/home/simon/Desktop/Projects/x5-test-task/venv/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: No such file or directory
        Is the server running locally and accepting
        connections on Unix domain socket "/var/run/postgresql/.s.PGSQL.5432"?

Не могу понять, почему я не могу подключиться из того же сценария.Должен ли я добавить время сна?

Edit1 : кажется, что это проблема времени.Попытка sleep(60) успешно подключена.

Ответы [ 3 ]

0 голосов
/ 04 февраля 2019

После проверки официальной документацией я обнаружил следующее:

Если при запуске postgres в контейнере нет базы данных, postgres создаст для вас базу данных по умолчанию.Хотя это ожидаемое поведение postgres, это означает, что не будет принимать входящие соединения в течение этого времени .Это может вызвать проблемы при использовании средств автоматизации, таких как docker-compose, которые запускают несколько контейнеров одновременно.

Это означает, что в течение нескольких секунд сразу после запуска контейнера вы не можете подключиться к postgres.

0 голосов
/ 11 июля 2019

Проверьте эту ссылку для настройки докера PythonAPI с Postgres: https://github.com/ajayrawat12/DockerPythonFalconPostgres

вы можете открыть порт db в файле docker-compose.yml, а затем использовать его для подключения из любого места, используя dbclient как 127.0.0.1:5432

0 голосов
/ 04 февраля 2019

Проблема в том, что вы пытаетесь подключиться сразу после запуска базы данных.Между началом контейнера и моментом, когда база данных начинает принимать соединения, проходит некоторое время.Вы можете либо подождать фиксированное количество времени с помощью sleep, либо создать цикл, который будет проверять, открыт ли порт БД.

...