MODIFIER - depuis le 23 juillet 2015
L'image docker postgres officielle exécutera .sql
scripts trouvés dans /docker-entrypoint-initdb.d/
dossier.
Il vous suffit donc de créer le script sql suivant :
init.sql
CREATE USER docker;
CREATE DATABASE docker;
GRANT ALL PRIVILEGES ON DATABASE docker TO docker;
et ajoutez-le dans votre Dockerfile :
Dockerfile
FROM library/postgres
COPY init.sql /docker-entrypoint-initdb.d/
Mais depuis le 8 juillet 2015, si tout ce dont vous avez besoin est de créer un utilisateur et une base de données , il est plus facile d'utiliser simplement le POSTGRES_USER
, POSTGRES_PASSWORD
et POSTGRES_DB
variables d'environnement :
docker run -e POSTGRES_USER=docker -e POSTGRES_PASSWORD=docker -e POSTGRES_DB=docker library/postgres
ou avec un Dockerfile :
FROM library/postgres
ENV POSTGRES_USER docker
ENV POSTGRES_PASSWORD docker
ENV POSTGRES_DB docker
pour les images antérieures au 23 juillet 2015
D'après la documentation de l'image Postgres Docker, il est dit que
[...] il sourcera tout script *.sh trouvé dans ce répertoire [
/docker-entrypoint-initdb.d
] pour effectuer une initialisation supplémentaire avant de démarrer le service
Ce qui est important ici, c'est "avant de démarrer le service" . Cela signifie que votre script make_db.sh sera exécuté avant le démarrage du service postgres, d'où le message d'erreur "n'a pas pu se connecter à la base de données postgres" .
Après cela, il y a une autre information utile :
Si vous devez exécuter des commandes SQL dans le cadre de votre initialisation, l'utilisation du mode mono-utilisateur Postgres est fortement recommandée.
D'accord, cela peut être un peu mystérieux au premier regard. Ce qu'il dit, c'est que votre script d'initialisation doit démarrer le service postgres en mode unique avant d'effectuer ses actions. Vous pouvez donc modifier votre make_db.ksh script comme suit et cela devrait vous rapprocher de ce que vous voulez :
REMARQUE , cela a changé récemment dans le commit suivant. Cela fonctionnera avec la dernière modification :
export PGUSER=postgres
psql <<- EOSQL
CREATE USER docker;
CREATE DATABASE docker;
GRANT ALL PRIVILEGES ON DATABASE docker TO docker;
EOSQL
Auparavant, l'utilisation de --single
mode était requis :
gosu postgres postgres --single <<- EOSQL
CREATE USER docker;
CREATE DATABASE docker;
GRANT ALL PRIVILEGES ON DATABASE docker TO docker;
EOSQL