1
votes

Comment exécuter psql interactive dans son conteneur docker?

Je souhaite exécuter une requête dans le shell interactif Postgres. J'utilise un conteneur Docker à cette fin comme suit:

Voici le morceau pertinent de docker-compose:

# psql

psql: FATAL:  role "root" does not exist

Néanmoins, je suis confronté à cette erreur:

docker exec -it -u 0 db_of_ivms bash

  db_of_ivms:
    image: postgres:10
    restart: unless-stopped
    ports:
     - 5432:5432
    container_name: db_of_ivms
    environment:
      POSTGRES_PASSWORD: xxx
      POSTGRES_USER: ivms_usr
      POSTGRES_DB: ivms_db


0 commentaires

3 Réponses :


4
votes

Vous avez besoin de shell avec l'utilisateur postgres

docker exec -it -u postgres db_of_ivms bash
postgres@2cec2435bb83:/$ psql -U ivms_usr -d ivms_db
psql (10.12 (Debian 10.12-1.pgdg90+1))
Type "help" for help.

ivms_db=# \l
                                 List of databases
   Name    |  Owner   | Encoding |  Collate   |   Ctype    |   Access privileges   
-----------+----------+----------+------------+------------+-----------------------
 ivms_db   | ivms_usr | UTF8     | en_US.utf8 | en_US.utf8 | 
 postgres  | ivms_usr | UTF8     | en_US.utf8 | en_US.utf8 | 
 template0 | ivms_usr | UTF8     | en_US.utf8 | en_US.utf8 | =c/ivms_usr          +
           |          |          |            |            | ivms_usr=CTc/ivms_usr
 template1 | ivms_usr | UTF8     | en_US.utf8 | en_US.utf8 | =c/ivms_usr          +
           |          |          |            |            | ivms_usr=CTc/ivms_usr
(4 rows)

Maintenant, pour les conteneurs que vous ne spécifiez pas POSTGRES_USER: ivms_usr :

postgres@d9b097b8db8c:/$ psql
postgres=# \l
                                 List of databases
   Name    |  Owner   | Encoding |  Collate   |   Ctype    |   Access privileges   
-----------+----------+----------+------------+------------+-----------------------
 postgres  | postgres | UTF8     | en_US.utf8 | en_US.utf8 | 
 template0 | postgres | UTF8     | en_US.utf8 | en_US.utf8 | =c/postgres          +
           |          |          |            |            | postgres=CTc/postgres
 template1 | postgres | UTF8     | en_US.utf8 | en_US.utf8 | =c/postgres          +
           |          |          |            |            | postgres=CTc/postgres
(3 rows)

Si vous spécifiez POSTGRES_USER: ivms_usr et Database (notez les arguments de la commande psql):

docker exec -it -u postgres db_of_ivms bash


3 commentaires

Merci pour la réponse. Cependant, le problème persiste: /$ psql : psql: FATAL: role "postgres" does not exist


pourriez-vous s'il vous plaît essayer avec docker exec -it -u ivms_usr db_of_ivms bash


unable to find user ivms_usr: no matching entries in passwd file



0
votes

J'ai trouvé une approche alternative via le shell Django:

$ python manage.py shell

from django.db import connection

cursor = connection.cursor()
cursor.execute("DELETE FROM django_migrations WHERE app='settings'")


0 commentaires

1
votes

J'utilise cette procédure par exemple pour obtenir un vidage:

# pg_dump -U <user-name> <db-name> > dump.sql

Maintenant, vous pouvez entrer des commandes psql avec l'autorisation root:

docker exec -it -u 0 <container-name> bash


0 commentaires