Docker-compose variables de entorno


Estoy tratando de configurar un contenedor postgres y quiero configurar el inicio de sesión de postgres con:

POSTGRES_USER: docker
POSTGRES_PASSWORD: docker

Así que he creado la docker-compose.yml like so

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

redis:
   image: redis

También he probado la otra sintaxis para la variable de entorno declarando la sección db como:

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

Sin embargo, ninguna de estas opciones parece funcionar porque por cualquier razón cada vez que intento conectarme a la base de datos postgres usando las diversas cadenas de conexión:

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

Todos me dan fallos de auth a diferencia de quejarse, no hay una base de datos de usuarios.

Author: royalaid, 2015-04-11

4 answers

¡El error de autenticación que tienes ayudaría mucho!

Encendí la imagen de postgres con tus argumentos:

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

Entonces ejecuté en:

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

Recibo el mensaje de error que espera porque tengo autenticación de confianza:

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

Para simular su contenedor web, ejecutaré otra instancia del contenedor postgres y vincularé el contenedor db y luego me conectaré de nuevo al contenedor 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"

Recibo un error de autenticación si introduzco el contraseña incorrecta. Pero, si introduzco la contraseña correcta:

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

Todo parece estar funcionando correctamente. Lo puse todo en un archivo yaml y lo probé de esa manera también:

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

Luego lo encendió con 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

Puede ver que el usuario y la contraseña fueron creados. Exec in:

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

Entonces, ¿lo único que se me ocurre es que estás tratando de conectarte a la base de datos desde tu host, no desde el contenedor web? O su contenedor web no está usando la 'db' como el anfitrión para conectarse? Su definición para el contenedor web no contiene ningún error que pueda ver.

 18
Author: Greg,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2017-09-20 11:08:18

Luché con esto por un tiempo y no estaba teniendo suerte con la respuesta aceptada, finalmente conseguí que funcionara quitando el contenedor:

docker-compose rm postgres

Y luego el volumen también:

docker volume rm myapp_postgres

Entonces cuando hice un nuevo docker-compose up vi CREATE ROLE volar, que estoy asumiendo es lo que se perdió en la inicial up.


Las razones para esto se detallan en aquí, en el repositorio Git para la imagen oficial de Docker para postgres.

 25
Author: dukedave,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2018-02-21 21:11:15

Tuve el mismo problema, y en mi caso el problema se solucionó con un solo comando:

docker-compose up --force-recreate
 3
Author: Alexey,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2017-11-30 14:36:12

Tuve una situación similar. Siguiendo la respuesta de @Greg, hice un docker-compose up , y recogí la variable de entorno.

Antes de eso, acababa de usar docker-compose run y no estaba recogiendo la variable de entorno como se demostró al ejecutar docker-compose exec task env. Extrañamente, docker-compose run task env mostró la variable de entorno que esperaba.

 1
Author: Bryan,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2017-06-23 18:45:24