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.
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.
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.
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
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.
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