Docker-compose des variables d'environnement

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

POSTGRES_USER: docker
POSTGRES_PASSWORD: docker

J'ai Donc créé le docker-composer.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 en utilisant les 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 par opposition à se plaindre il n'y a pas de base de données des utilisateurs.

30
demandé sur royalaid 2015-04-11 20:24:06

4 réponses

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

J'ai déclenché l'image postgres avec vos arguments:

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

Ensuite, j'ai exécuté:

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

Je reçois le message d'erreur que vous attendez parce que j'ai une 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 connecter 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 mot de passe incorrect. Mais, si j'entre le mot de passe correct:

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 l'ai testé de cette façon aussi:

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

Puis il a déclenché 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. Je exec 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 du conteneur web? Ou votre conteneur web n'utilise pas la 'db' en tant qu'hôte à qui se connecter? Votre définition pour le conteneur web ne contient aucune erreur que je peux voir.

18
répondu Greg 2017-09-20 11:08:18

J'ai lutté avec cela pendant un moment et n'ai pas eu de chance avec la réponse acceptée, j'ai finalement réussi à le faire fonctionner en enlevant le conteneur:

docker-compose rm postgres

Et puis le volume aussi:

docker volume rm myapp_postgres

Puis quand j'ai fait un nouveau docker-compose up j'ai Vu CREATE ROLEpasser, ce que je suis en supposant que est ce qui a été manqué sur le up initial.


Les raisons de ceci sont développées sur ici , sur le repo Git pour L'image officielle de Docker pour postgres.

25
répondu dukedave 2018-02-21 21:11:15

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

docker-compose up --force-recreate
3
répondu Alexey 2017-11-30 14:36:12

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

Avant cela, je venais d'utiliser docker-compose run et il ne ramassait 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
répondu Bryan 2017-06-23 18:45:24