PostgreSQL
 sql >> Base de données >  >> RDS >> PostgreSQL

Comment créer un utilisateur/une base de données dans un script pour Docker Postgres

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