Construire postgres docker récipient avec de schéma initial
Je suis à la recherche de construire dockerfiles qui représentent les bases de données d'entreprise qui existent déjà. De même, j'aimerais créer un menu fixe de fichier qui commence par la restauration d'une psql dump.
J'ai mon psql_dump.sql
dans le .
répertoire.
FROM postgres
ADD . /init_data
run "createdb" "--template=template0" "my_database"
run "psql" "-d" "my_database" --command="create role my_admin superuser"
run "psql" "my_database" "<" "init_data/psql_dump.sql"
Je pensais que ce serait assez bon pour le faire. J'aimerais éviter les solutions qui utilisent un .sh
script. Comme cette solution.
- Je utiliser template0 depuis le psql la documentation dit que vous devez les mêmes utilisateurs qui ont été créés dans la base de données d'origine, et vous avez besoin pour créer la base de données avec template0 avant de vous restaurer.
Cependant, il me donne une erreur:
createdb: could not connect to database template1: could not connect to server: No such file or directory
Is the server running locally and accepting
Je suis également en utilisant le panneau de composer pour l'ensemble de l'application, si la résolution de ce problème dans le panneau-composer est mieux, je serais heureux d'utiliser la base de psql image et utiliser docker composer pour ce faire.
OriginalL'auteur jQwierdy | 2016-01-12
Vous devez vous connecter pour publier un commentaire.
Selon la guide d'utilisation officielle, PostreSQL Docker image, tout ce que vous avez besoin est:
Dockerfile
La
POSTGRES_DB
variable d'environnement va charger le conteneur pour créer unmy_database
schéma lors de la première exécution.Et tout
.sql
fichier trouvé dans le/docker-entrypoint-initdb.d/
du conteneur sera exécuté.Si vous voulez exécuter
.sh
scripts, vous pouvez également leur fournir dans la/docker-entrypoint-initdb.d/
répertoire.psql --username=my_user --dbname=my_database
qui fait fonctionner de la façon dont je m'attendais.Le sujet demande de Construire "postgres docker récipient avec de schéma initial". Mais ce que vous suggérez crée le schéma de démarrage, plutôt que de construire un conteneur qui a déjà de ce schéma. Si le schéma prend 5 minutes pour créer, c'est une pénalité de 5 minutes à chaque fois, c'est pour créer un volume, plutôt que de l'avoir à l'intérieur du conteneur réel.
Avoir vos données à l'intérieur de l'image (de sorte que vous pouvez l'avoir à la création des conteneurs) est une mauvaise idée car le support de l'image de l'union du système de fichiers est lente. Vos données doivent être sur un volume, donc en dehors du conteneur de système de fichiers / d'image de système de fichiers
vous pouvez le faire en 3 étapes: la première est de créer un conteneur comme vous l'avez fait, puis copier les données d'un hôte local directory, puis chaque fois que vous voulez une nouvelle PostreSQL, démarrer une PostreSQL récipient dont le volume est de travailler avec une copie de ce répertoire de l'hôte.
OriginalL'auteur Thomasleveil
Comme dit dans les commentaires, @Thomasleveil réponse est grand et simple, si votre schéma de loisirs est rapide.
Mais dans mon cas, c'est lent, et je voulais utiliser docker volumes, voici donc ce que j'ai fait
Dockerfile:
puis l'exécuter et créer un nouveau répertoire local qui contient les postgres données après son rempli à partir de la “psql_dump.sql” fichier:
docker cp mypg:/var/lib/postgresql/data ./postgres-data
Copier les données sur un temp dossier de données, et de commencer une nouvelle postgres docker-composer récipient dont le volume est le nouveau temp dossier de données:
startPostgres.sh:
et le docker-composer.fichier yml est:
Maintenant, vous pouvez exécuter les étapes #1 et #2 sur une nouvelle machine, ou si votre psql_dump.sql changements. Et chaque fois que vous voulez un nouveau clean (mais déjà initialisé) db, vous pouvez uniquement exécuter startPostgres.sh à partir de l'étape #3.
Et il utilise toujours docker volumes.
OriginalL'auteur yishaiz