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.
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.
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 ROLE
passer, 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.
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
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.