2015-04-11 18 views
26

Sto provando ad installare un contenitore Postgres e vogliono impostare i postgres login con:variabili d'ambiente Docker-Compose

POSTGRES_USER: docker 
POSTGRES_PASSWORD: docker 

Così ho creato la finestra mobile-compose.yml in questo modo

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

redis: 
    image: redis 

ho anche provato l'altra sintassi per la variabile ambiente dichiarare la sezione db come:

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

Tuttavia Neithe r di queste opzioni sembra funzionare perché per qualsiasi motivo ogni volta che provo a connettersi al database Postgres utilizzando le varie stringhe di connessione:

postgres://postgres:[email protected]:5432/users 
postgres://postgres:[email protected]:5432/users 
postgres://docker:[email protected]:5432/users 

Tutti mi danno fallimenti auth in contrapposizione a lamenta non esiste un database utenti.

+2

'@ db' implica una connessione remota e nulla suggerisce che li hai permesso a' postgresql.conf' e 'pg_hba.conf', specialmente l'ultimo. Non ha senso non includere direttamente il messaggio di errore auth in questa domanda. –

+1

Sto riscontrando un problema molto simile. Ho apportato le modifiche necessarie in 'pg_hba.conf' per consentire le connessioni remote. Il problema sembra essere "docker-compose' ignorando la variabile d'ambiente' POSTGRES_PASSWORD' – jap1968

risposta

18

L'errore di autenticazione che hai ottenuto sarebbe stato di grande aiuto!

ho sparato l'immagine postgres con i tuoi argomenti:

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

Poi ho eseguito con exec in:

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

ottengo il messaggio di errore vi aspettate, perché ho l'autenticazione fiducia:

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 

Per simulare il contenitore Web, eseguirò un'altra istanza del contenitore postgres e di lin k il contenitore db e quindi collegare al contenitore db:

[email protected] /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" 

ottengo un errore di autenticazione se entro la password errata. Ma, se inserisco la password corretta:

[email protected] /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 

Tutto sembra funzionare correttamente. Ho messo tutto in un file YAML e testato in questo modo così:

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

poi sparato in su con finestra mobile-composizione:

[email protected] /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 
[email protected] /tmp/i $ bg 

si può vedere che l'utente e la password sono stati creati. I exec in:

[email protected] /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" 
[email protected] /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" 

[email protected] /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 

Quindi l'unica cosa che posso pensare è che si sta tentando di connettersi al database dal vostro ospite, non il contenitore web? O il tuo web container non sta usando il 'db' come host a cui connettersi? La tua definizione per il contenitore web non contiene errori che posso vedere.

+6

Grazie per il tuo aiuto, si è scoperto qualcosa di strano durante la creazione dell'immagine per la prima volta causando i problemi di autenticazione che ho visto. Eseguendo un 'docker-compose rm' e poi' docker-compose up 'lo abbiamo corretto – royalaid

+2

Ho dovuto fare un po' di più per far funzionare il mio: 'docker stop $ (finestra mobile ps -a -q)' e poi 'finestra mobile rm $ (finestra mobile ps -a -q) 'seguita da' docker rmi $ (immagini docker -q) ' – Rajiv

16

ho lottato con questo per un po 'e non stava avendo fortuna con la risposta accettata, ho finalmente capito di lavorare rimuovendo il contenitore:

docker-compose rm postgres 

E poi il volume di così:

docker volume rm myapp_postgres 

Poi quando ho fatto un fresco docker-compose up vidi CREATE ROLE fly by, che sto assumendo è quello che è stato mancato il primo up.


Le ragioni di questo sono elaborati su here, sul repo Git per l'immagine ufficiale Docker per Postgres.

+2

vuol dire che le variabili di ambiente vengono lette solo alla prima esecuzione e vengono ignorate in tutte le esecuzioni successive? Se è così, sarebbe probabilmente meglio lasciare queste variabili e quei valori manualmente dopo la prima esecuzione. – wotanii

+0

Ha funzionato completamente per me! –

+2

Sì @wotanii sembra che sia la ragione. La tua opinione mi ha portato a [questo corrispondente problema] (https://github.com/docker-library/postgres/issues/41#issuecomment-167603905). Aggiornerò la risposta per fare riferimento anche a questo. Grazie! – dukedave

1

Ho avuto una situazione simile. Seguendo la risposta di @Greg, ho creato una finestra mobile - e ho rilevato la variabile di ambiente.

Prima di questo, avevo appena usato finestra mobile-run composizione e non raccoglievo la variabile d'ambiente, come dimostrato mediante l'esecuzione finestra mobile-comporre compito exec ENV. Stranamente, attività di esecuzione comporre docker env ha mostrato la variabile di ambiente che mi aspettavo.

3

Ho avuto lo stesso problema, e nel mio caso problema è stato risolto con un unico comando:

docker-compose up --force-recreate 
Problemi correlati