J'ai essayé de mettre en place un conteneur pour une instance postgres de développement en créant un utilisateur et une base de données personnalisés. J'utilise l' image Docker officielle de PostgreSQL . Dans la documentation, il vous demande d'insérer un script bash à l'intérieur du /docker-entrypoint-initdb.d/
dossier pour configurer la base de données avec tous les paramètres personnalisés.
Mon script bash: make_db.sh
su postgres -c "createuser -w -d -r -s docker"
su postgres -c "createdb -O docker docker"
Dockerfile
FROM library/postgres
RUN ["mkdir", "/docker-entrypoint-initdb.d"]
ADD make_db.sh /docker-entrypoint-initdb.d/
L'erreur que j'obtiens de docker logs -f db
(db est mon nom de conteneur) est:
createuser: impossible de se connecter à la base de données postgres: impossible de se connecter au serveur: aucun fichier ou répertoire de ce type
Il semble que les commandes à l'intérieur du /docker-entrypoint-initdb.d/
dossier soient exécutées avant le démarrage de postgres. Ma question est, comment puis-je configurer un utilisateur / base de données par programmation en utilisant le conteneur officiel postgres? Existe-t-il un moyen de le faire avec un script?
la source
gosu postgres postgres --single < /tmp/somefile.sql
psql -U myDb -d myDb -f myDb.sql
docker-entrypoint-initdb.d
je vois moninit.sql
avec le code sql dedans. MAIS quand j'ouvre mysql (en utilisant l'accès root) et que je tape show databases je ne vois que la valeur par défaut dans ledocker-compose.yml
fichier! Pourquoi ça ne marche pas pour moi?db.sql
même après avoir été copié dans `docker-entrypoint-initdb.d`Vous pouvez maintenant placer des fichiers .sql dans le répertoire init:
À partir des documents
La copie de votre fichier .sql fonctionnera donc.
la source
Warning: scripts in /docker-entrypoint-initdb.d are only run if you start the container with a data directory that is empty; any pre-existing database will be left untouched on container startup. One common problem is that if one of your /docker-entrypoint-initdb.d scripts fails (which will cause the entrypoint script to exit) and your orchestrator restarts the container with the already initialized data directory, it will not continue on with your scripts.
En utilisant
docker-compose
:En supposant que vous disposez de la disposition du répertoire suivante:
Fichier:
docker-compose.yml
Fichier:
Docker/init.sql
Fichier:
Docker/db.Dockerfile
Services de composition et de démarrage:
la source
J'ajoute des commandes personnalisées à un environnement évoqué dans une CMD après le démarrage des services ... Je ne l'ai pas fait avec postgres, mais avec Oracle:
et commencer par
.
la source
Vous pouvez utiliser ces commandes:
la source
ENCODING 'LATIN1'
est très bizarre ... Vous devez avoir des besoins très particuliers pour éviter d'utiliser utf8Vous devez avoir la base de données en cours d'exécution avant de créer les utilisateurs. Pour cela, vous avez besoin de plusieurs processus. Vous pouvez soit démarrer postgres dans un sous-shell (&) dans le script shell, soit utiliser un outil comme supervisord pour exécuter postgres puis exécuter les scripts d'initialisation.
Un guide pour supervisord et docker https://docs.docker.com/articles/using_supervisord/
la source
Avec docker compose, il existe une alternative simple (pas besoin de créer un Dockerfile). Créez simplement un init-database.sh:
Et référencez-le dans la section volumes:
la source