web-dev-qa-db-fra.com

Variables d'environnement Docker-compose

J'essaie de configurer un conteneur postgres et je souhaite configurer la connexion postgres avec:

POSTGRES_USER: docker
POSTGRES_PASSWORD: docker

J'ai donc créé le docker-compose.yml comme ça

web:
  build: .
  ports:
    - "62576:62576"
  links:
   - redis
   - db
db:
  image: postgres
  environment:
    POSTGRES_PASSWORD: docker
    POSTGRES_USER: docker

redis:
   image: redis

J'ai également essayé l'autre syntaxe pour la variable d'environnement déclarant la section db comme:

db:
  image: postgres
  environment:
   - POSTGRES_PASSWORD=docker
   - POSTGRES_USER=docker

Cependant, aucune de ces options ne semble fonctionner, car pour une raison quelconque, chaque fois que j'essaie de me connecter à la base de données postgres à l'aide des différentes chaînes de connexion:

postgres://postgres:postgres@db:5432/users
postgres://postgres:docker@db:5432/users
postgres://docker:docker@db:5432/users

Ils me donnent tous des échecs d'authentification au lieu de se plaindre qu'il n'y a pas de base de données d'utilisateurs.

32
royalaid

L'erreur d'authentification que vous avez obtenue aiderait beaucoup!

J'ai tiré l'image postgres avec vos arguments:

docker run --name db -d -e POSTGRES_PASSWORD=docker -e POSTGRES_USER=docker postgres

Puis j'ai exécuté:

docker exec -it db psql -U docker user
psql: FATAL:  database "user" does not exist

J'obtiens le message d'erreur que vous attendez car j'ai l'authentification de confiance:

docker exec -it db cat /var/lib/postgresql/data/pg_hba.conf | grep -v '^#'

local   all             all                                     trust
Host    all             all             127.0.0.1/32            trust
Host    all             all             ::1/128                 trust
Host all all 0.0.0.0/0 md5

Pour simuler votre conteneur Web, je vais exécuter une autre instance du conteneur postgres et lier le conteneur db, puis me reconnecter au conteneur db:

core@ku1 /tmp/i $ docker run --rm --name web --link db:db -it postgres psql -h db -Udocker user
Password for user docker: 
psql: FATAL:  password authentication failed for user "docker"

J'obtiens une erreur d'authentification si j'entre un mot de passe incorrect. Mais, si j'entre le bon mot de passe:

core@ku1 /tmp/i $ docker run --rm --name web --link db:db -it postgres psql -h db -Udocker user
Password for user docker: 
psql: FATAL:  database "user" does not exist

Tout semble fonctionner correctement. J'ai tout mis dans un fichier yaml et je l'ai également testé de cette façon:

web:
  image: postgres
  command: sleep 999
  ports:
    - "62576:62576"
  links:
   - db
db:
  image: postgres
  environment:
    POSTGRES_PASSWORD: docker
    POSTGRES_USER: docker

puis lancé avec docker-compose:

core@ku1 /tmp/i $ docker-compose -f dc.yaml up
Creating i_db_1...
Creating i_web_1...
Attaching to i_db_1, i_web_1
db_1  | ok
db_1  | creating template1 database in /var/lib/postgresql/data/base/1 ... ok
db_1  | initializing pg_authid ... ok
db_1  | initializing dependencies ... ok
db_1  | creating system views ... ok
db_1  | loading system objects' descriptions ... ok
db_1  | creating collations ... ok
db_1  | creating conversions ... ok
db_1  | creating dictionaries ... ok
db_1  | setting privileges on built-in objects ... ok
db_1  | creating information schema ... ok
db_1  | loading PL/pgSQL server-side language ... ok
db_1  | vacuuming database template1 ... ok
db_1  | copying template1 to template0 ... ok
db_1  | copying template1 to postgres ... ok
db_1  | syncing data to disk ... ok
db_1  | 
db_1  | WARNING: enabling "trust" authentication for local connections
db_1  | You can change this by editing pg_hba.conf or using the option -A, or
db_1  | --auth-local and --auth-Host, the next time you run initdb.
db_1  | 
db_1  | Success. You can now start the database server using:
db_1  | 
db_1  |     postgres -D /var/lib/postgresql/data
db_1  | or
db_1  |     pg_ctl -D /var/lib/postgresql/data -l logfile start
db_1  | 
db_1  | 
db_1  | PostgreSQL stand-alone backend 9.4.1
db_1  | backend> statement: CREATE DATABASE "docker" ;
db_1  | 
db_1  | backend> 
db_1  | 
db_1  | PostgreSQL stand-alone backend 9.4.1
db_1  | backend> statement: CREATE USER "docker" WITH SUPERUSER PASSWORD 'docker' ;
db_1  | 
db_1  | backend> 
db_1  | LOG:  database system was shut down at 2015-04-12 22:01:12 UTC
db_1  | LOG:  database system is ready to accept connections
db_1  | LOG:  autovacuum launcher started
^Z
[1]+  Stopped                 docker-compose -f dc.yaml up
core@ku1 /tmp/i $ bg

vous pouvez voir que l'utilisateur et le mot de passe ont été créés. J'exécute dans:

core@ku1 /tmp/i $ docker exec -it i_web_1 psql -Udocker -h db user
Password for user docker: 
psql: FATAL:  password authentication failed for user "docker"
core@ku1 /tmp/i $
db_1  | FATAL:  password authentication failed for user "docker"
db_1  | DETAIL:  Connection matched pg_hba.conf line 95: "Host all all 0.0.0.0/0 md5"

core@ku1 /tmp/i $ docker exec -it i_web_1 psql -Udocker -h db user
Password for user docker: 
psql: FATAL:  database "user" does not exist
db_1  | FATAL:  database "user" does not exist

Donc, la seule chose à laquelle je peux penser est que vous essayez de vous connecter à la base de données à partir de votre hôte, pas au conteneur Web? Ou votre conteneur Web n'utilise pas le "db" comme hôte pour se connecter? Votre définition pour le conteneur Web ne contient aucune erreur que je puisse voir.

17
Greg

Je me suis débattu avec cela pendant un certain temps et je n'ai pas eu de chance avec la réponse acceptée, je l'ai finalement fait fonctionner en retirant le conteneur:

docker-compose rm postgres

Et puis le volume également:

docker volume rm myapp_postgres

Puis, quand j'ai fait une nouvelle docker-compose up J'ai vu CREATE ROLE survole, ce que je en supposant est ce qui a été manqué sur le up initial.


Les raisons de cela sont expliquées sur ici , sur le dépôt Git pour l'image officielle Docker pour les postgres.

39
dukedave

J'ai eu le même problème, et dans mon cas, le problème a été résolu avec une seule commande:

docker-compose up --force-recreate
9
Alexey

J'avais une situation similaire. Suite à la réponse de @Greg, j'ai fait un docker-compose up, et il a repris la variable d'environnement.

Avant cela, je venais d'utiliser docker-compose run et il ne récupérait pas la variable d'environnement comme prouvé en exécutant docker-compose exec task env. Étrangement, docker-compose run task env a montré la variable d'environnement que j'attendais.

1
Bryan