Я не могу подключиться к образу 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)
успешно подключена.