web-dev-qa-db-fra.com

Comment entrer dans psql d'un conteneur postgres en cours d'exécution?

J'ai créé un conteneur postgres en utilisant le tutoriel sur le fig website . J'ai nommé le conteneur db.

Le conteneur est en cours d'exécution et mon application s'y connecte correctement. J'ai essayé d'exécuter la commande fig run db psql avec le conteneur db en cours d'exécution et a obtenu l'erreur:

psql: 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"?

Comment accéder à l'interface psql dans le conteneur en cours d'exécution db?

26
sargas

fig créera un conteneur docker avec un nom différent de celui utilisé dans le fig.yml fichier.

Je l'ai fait fonctionner en trouvant le nom du conteneur avec docker ps et en regardant la colonne [~ # ~] noms [~ # ~] .

Ensuite, exécutez la commande psql dans le conteneur en cours d'exécution avec docker exec -ti NAME_OF_CONTAINER psql -U YOUR_POSTGRES_USERNAME

Notez que docker execexécute la commande psql sur un conteneur en cours d'exécution, par opposition à docker run qui lancera un nouveau conteneur.


Mise à jour

fig est maintenant appelé docker-compose

50
sargas

Vous devez exécuter un nouveau conteneur pour vous connecter à celui démarré par la fig. Il en est ainsi parce que le conteneur principal par défaut démarre le service et si vous le faites fig run db psql fig ne démarrera PAS le service mais exécutera le client psql à la place. Voir le Dockerfile .

Donc, pour vous connecter au service PostgreSQL, vous devez exécuter un autre conteneur lié à celui démarré par la fig. Voir https://registry.hub.docker.com/_/postgres/ .

Tout d'abord, puisque fig change le nom des conteneurs démarrés, vérifiez la colonne NOMS du docker ps conteneur après avoir fait fig up. Alors:

docker run -it --link <postgres_container_name>:postgres --rm postgres sh -c 'exec psql -h "$POSTGRES_PORT_5432_TCP_ADDR" -p "$POSTGRES_PORT_5432_TCP_PORT" -U postgres'

Vous pouvez faire le docker exec astuce aussi bien que décrit par @sargas aussi, mais la manière de relier me semble plus canonique.

2
dukebody

Pouvez-vous publier le résultat de docker ps? Je suppose que vous devez spécifier le port que le conteneur postgres expose. Fonctionnement docker ps devrait vous donner

CONTAINER ID        IMAGE                          COMMAND                CREATED             STATUS              PORTS                    NAMES
948b1f6ebc0a        my_postgres:latest            "/usr/lib/postgresql   6 days ago          Up 6 days           0.0.0.0:49155->5432/tcp   db

et en regardant sous la colonne PORTS pour votre conteneur de base de données, vous verrez le port sur lequel la base de données est réellement exposée. Dans ce cas, c'est 49155, mais docker choisira un port aléatoire entre 49153 et 65535 s'il n'est pas explicitement spécifié au démarrage du conteneur. Vous devez fournir le -p option sur psql pour cibler ce port en tant que tel

psql -p 49155 ... 

Source: https://docs.docker.com/userguide/dockerlinks/

1
Justin