1
votes

Impossible de se connecter à postgres dans le conteneur Docker en dehors du shell Python

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 ---


0 commentaires

3 Réponses :


1
votes

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.


1 commentaires

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.



0
votes

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.


0 commentaires

0
votes

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


1 commentaires

Désolé, ce n'est pas le sujet de cette question.