Je ne peux pas me connecter à l'image Postgres dans le conteneur Docker en dehors du shell Python.
J'ai un script qui télécharge et déploie l'image Docker de Postgres. L'une des étapes est que je souhaite créer des tables dans la base de données.
Si j'exécute setup.py
, il téléchargera l'image et installera le conteneur Docker sur le machine locale et attendez une connexion. Si ensuite je vais ouvrir un shell Python et essayer de me connecter à DB - tout fonctionne bien.
Mon Dockerfile
:
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"?
Mon fichier setup.py
:
if __name__ == "__main__": update_apt() install_docker() install_docker_image() docker_run() conn = psycopg2.connect(dbname='monitoring', user='process_monitor')
Voici ce que j'ai dans cli lorsque j'exécute ceci:
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 ---
3 Réponses :
Le problème est que vous essayez de vous connecter juste après le démarrage de la base de données. Il y a un certain temps entre le début du conteneur et le moment où la base de données commence à accepter les connexions. Vous pouvez soit attendre une durée fixe avec sleep
, soit créer une boucle qui vérifiera si le port db est ouvert.
Oui, c'est correct. En outre, cela m'a conduit à la création correcte de la base de données via des scripts SQL à l'intérieur de docker.
Après vérification avec la documentation officielle, j'ai trouvé ceci:
S'il n'y a pas de base de données lorsque postgres démarre dans un conteneur, alors postgres créera la base de données par défaut pour vous. Bien que ce soit le comportement attendu de postgres, cela signifie que il n'acceptera pas connexions entrantes pendant cette période . Cela peut entraîner des problèmes lorsque en utilisant des outils d'automatisation, tels que docker-compose, qui démarrent plusieurs conteneurs simultanément.
Cela signifie que pendant plusieurs secondes juste après le début du conteneur, vous ne pouvez pas vous connecter à postgres.
Vérifiez ce lien pour la configuration du docker PythonAPI avec Postgres: https://github.com/ajayrawat12/DockerPythonFalconPostgres
vous pouvez exposer le port db dans le fichier docker-compose.yml, puis l'utiliser en connexion de n'importe où en utilisant dbclient comme 127.0.0.1:5432
Désolé, ce n'est pas le sujet de cette question.