MODIFICA - dal 23 luglio 2015
L' immagine docker ufficiale di postgres eseguirà gli .sql
script trovati nella /docker-entrypoint-initdb.d/
cartella.
Quindi tutto ciò che serve è creare il seguente script sql:
init.sql
CREATE USER docker;
CREATE DATABASE docker;
GRANT ALL PRIVILEGES ON DATABASE docker TO docker;
e aggiungilo nel tuo Dockerfile:
Dockerfile
FROM library/postgres
COPY init.sql /docker-entrypoint-initdb.d/
Ma dal momento che 8 luglio 2015, se tutto ciò che serve è quello di creare un utente e un database , è più facile fare uso solo al POSTGRES_USER
, POSTGRES_PASSWORD
e POSTGRES_DB
le variabili di ambiente:
docker run -e POSTGRES_USER=docker -e POSTGRES_PASSWORD=docker -e POSTGRES_DB=docker library/postgres
o con un file Docker:
FROM library/postgres
ENV POSTGRES_USER docker
ENV POSTGRES_PASSWORD docker
ENV POSTGRES_DB docker
per immagini precedenti al 23 luglio 2015
Dalla documentazione dell'immagine Docker di Postgres , si dice che
[...] genererà qualsiasi script * .sh trovato in quella directory [ /docker-entrypoint-initdb.d
] per eseguire ulteriori inizializzazioni prima di avviare il servizio
Ciò che è importante qui è "prima di iniziare il servizio" . Ciò significa che lo script make_db.sh verrà eseguito prima dell'avvio del servizio Postgres , quindi il messaggio di errore "Impossibile connettersi al database Postgres" .
Dopodiché c'è un'altra utile informazione:
Se è necessario eseguire i comandi SQL come parte dell'inizializzazione, si consiglia vivamente di utilizzare la modalità utente singolo di Postgres.
D'accordo, questo può essere un po 'misterioso al primo sguardo. Ciò che dice è che lo script di inizializzazione dovrebbe avviare il servizio Postgres in modalità singola prima di eseguire le sue azioni. Quindi potresti cambiare il tuo script make_db.ksh come segue e dovrebbe avvicinarti a quello che vuoi:
NOTA , questo è cambiato di recente nel seguente commit . Questo funzionerà con l'ultima modifica:
export PGUSER=postgres
psql <<- EOSQL
CREATE USER docker;
CREATE DATABASE docker;
GRANT ALL PRIVILEGES ON DATABASE docker TO docker;
EOSQL
In precedenza, --single
era richiesto l'uso della modalità:
gosu postgres postgres --single <<- EOSQL
CREATE USER docker;
CREATE DATABASE docker;
GRANT ALL PRIVILEGES ON DATABASE docker TO docker;
EOSQL
gosu postgres postgres --single < /tmp/somefile.sql