Je cherche à créer des dockerfiles qui représentent des bases de données d'entreprise qui existent déjà. De même, j'aimerais créer un fichier docker qui commence par restaurer un vidage psql.
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. Je voudrais éviter les solutions qui utilisent un .sh
script. Comme cette solution .
J'utilise template0 car la documentation psql indique que vous avez besoin des mêmes utilisateurs créés que ceux qui se trouvaient dans la base de données d'origine, et vous devez créer la base de données avec template0 avant de restaurer.
Cependant, cela 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
J'utilise également docker compose pour l'application globale, si la résolution de ce problème dans docker-compose est meilleure, je serais heureux d'utiliser l'image psql de base et d'utiliser docker compose pour ce faire.
Selon le guide d'utilisation pour l'image Docker PostreSQL officielle, tout ce dont vous avez besoin est:
FROM postgres
ENV POSTGRES_DB my_database
COPY psql_dump.sql /docker-entrypoint-initdb.d/
Le POSTGRES_DB
la variable d'environnement demandera au conteneur de créer un my_database
schéma lors de la première exécution.
Et n'importe quel .sql
fichier trouvé dans le /docker-entrypoint-initdb.d/
du conteneur sera exécuté.
Si vous souhaitez exécuter .sh
scripts, vous pouvez également les fournir dans le /docker-entrypoint-initdb.d/
répertoire.
Comme indiqué dans les commentaires, la réponse @Thomasleveil est géniale et simple si la récréation de votre schéma est rapide. Mais dans mon cas, c'est lent, et je voulais utiliser des volumes de docker, alors voici ce que j'ai fait
Dockerfile:
FROM postgres
WORKDIR /docker-entrypoint-initdb.d
ADD psql_dump.sql /docker-entrypoint-initdb.d
EXPOSE 5432
puis exécutez-le et créez un nouveau répertoire local qui contient les données postgres après leur remplissage à partir du fichier "psql_dump.sql": docker cp mypg:/var/lib/postgresql/data ./postgres-data
Copiez les données dans un dossier de données temporaires et démarrez un nouveau conteneur docker-compose postgres dont le volume se trouve dans le nouveau dossier de données temporaires:
startPostgres.sh:
rm -r ./temp-postgres-data/data
mkdir -p ./temp-postgres-data/data
cp -r ./postgres-data/data ./temp-postgres-data/
docker-compose -p mini-postgres-project up
et le fichier docker-compose.yml est:
version: '3'
services:
postgres:
container_name: mini-postgres
image: postgres:9.5
ports:
- "5432:5432"
volumes:
- ./temp-postgres-data/data:/var/lib/postgresql/data
Vous pouvez maintenant exécuter les étapes # 1 et # 2 sur une nouvelle machine ou si votre psql_dump.sql change. Et chaque fois que vous voulez une nouvelle base de données propre (mais déjà initialisée), vous ne pouvez exécuter startPostgres.sh qu'à partir de l'étape 3. Et il utilise toujours des volumes de docker.