2017-09-14 1 views
1

J'utilise ensuite Dockerfile pour installer le moteur de base de données postgresExécuter des scripts SQL à l'intérieur Dockerfile

FROM postgres:9.6.5 
ENV POSTGRES_USER postgres 
ENV POSTGRES_PASSWORD xxx 
ENV POSTGRES_DB postgres 
ADD localDump.sql /docker-entrypoint-initdb.d 

Je dois créer ROLE CREATE ROLE read_only; avant d'initialiser ma base de données et avant d'exécuter le script localDump.sql.

Alors, comment puis-je exécuter des scripts SQL directement dans Dockerfile?

Répondre

3

======================== réponse correcte Début ================= =======

Selon la documentation de l'image Postgres, vous pouvez étendre l'image d'origine en exécutant un script ou un fichier SQL.

Si vous souhaitez faire l'initialisation supplémentaire dans une image dérivée de celle-ci, ajouter un ou plusieurs * .sql, * .sql.gz ou * scripts .sh sous /docker-entrypoint-initdb.d (créer le répertoire si nécessaire). Après que l'entrypoint appelle initdb pour créer l'utilisateur et la base de données postgres par défaut, il exécutera tous les fichiers * .sql et recherchera tous les scripts * .sh trouvés dans ce répertoire pour poursuivre l'initialisation avant de démarrer le service.

Pour votre Dockerfile, vous pourriez faire quelque chose comme ça.

FROM postgres:9.6.5 

ENV POSTGRES_USER postgres 
ENV POSTGRES_PASSWORD xxx 
ENV POSTGRES_DB postgres 

ADD create-role.sh /docker-entrypoint-initdb.d 
ADD localDump.sql /docker-entrypoint-initdb.d 

Vous aurez également besoin du script create-role.sh pour exécuter la commande PLSQL

#!/bin/bash 
set -e 

psql -v ON_ERROR_STOP=1 --username "$POSTGRES_USER" <<-EOSQL 
    CREATE ROLE read_only; 
EOSQL 

Notez que je ne suis pas un DBA SQL, PLSQL la commande est juste un exemple.

======================== réponse correcte Fin ================= =======

réponse originale a laissé pour la postérité:

peut-on utiliser psql? Quelque chose comme ca.

FROM postgres:9.6.5 

ENV POSTGRES_USER postgres 
ENV POSTGRES_PASSWORD xxx 
ENV POSTGRES_DB postgres 

RUN psql -U postgres -d database_name -c "SQL_QUERY" 

ADD localDump.sql /docker-entrypoint-initdb.d 

Vous devriez trouver comment exécuter SQL Query for Postgres de bash, puis ajoutez une instruction RUN dans votre Dockerfile.

+0

J'ai déjà essayé cette commande mais cela n'a pas fonctionné, cette commande "RUN psql ..." m'a donné l'erreur suivante >>> psql: impossible de se connecter au serveur: Aucun fichier ou répertoire \t Est le serveur s'exécutant localement et acceptant \t connexions sur le socket de domaine Unix "/var/run/postgresql/.s.PGSQL.5432"? –

+0

Pouvez-vous essayer d'exécuter ceci: 'docker exec -it CONTAINER_ID bash' Puis vérifiez la même commande depuis l'intérieur du conteneur? –

+0

comment pourrais-je lancer "docker ..." dans Dockerfile (ce n'est pas possible) mais si vous demandez de l'exécuter avec le conteneur postgres existant pas de docker fichier donc je peux dire oui ça marche et j'ai essayé "psql -h localhost - U postgres -c "SELECT COUNT (*) FROM xxx;" "et il m'a donné le résultat attendu –