j'exécute mon application avec docker-compose avec le fichier yml ci-dessous
postgres:
container_name: postgres
image: postgres:${POSTGRES_VERSION}
volumes:
- postgresdata:/var/lib/postgresql/data
expose:
- "5432"
environment:
- POSTGRES_DB=42EXP
- POSTGRES_USER=${POSTGRES_USER}
- POSTGRES_PASSWORD=${POSTGRES_PASSWORD}
node:
container_name: node
links:
- postgres:postgres
depends_on:
- postgres
volumes:
postgresdata:
Comme vous pouvez le voir ici, j'utilise un named volume
pour gérer l'état de postgres.
Selon la documentation officielle, je peux sauvegarder un volume comme celui-ci
docker run --rm --volumes postgresdata:/var/lib/postgresql/data -v $(pwd):/backup ubuntu tar cvf /backup/backup.tar /dbdata
Certains autres tutoriels ont suggéré d’utiliser la fonction pg-dump
fournie par postgres pour les sauvegardes.
pg_dump -Fc database_name_here > database.bak
Je suppose que je devrais aller à l'intérieur du conteneur postgres pour exécuter cette fonction et monter le répertoire de sauvegarde sur l'hôte.
Une approche est-elle meilleure/préférable que l'autre?
Pour exécuter pg_dump, vous pouvez utiliser la commande docker exec
:
Pour sauvegarder:
docker exec -u <your_postgres_user> <postgres_container_name> pg_dump -Fc <database_name_here> > db.dump
Abandonner la base de données (ne le faites pas en production, uniquement à des fins de test !!!):
docker exec -u <your_postgres_user> <postgres_container_name> psql -c 'DROP DATABASE <your_db_name>'
Restaurer:
docker exec -i -u <your_postgres_user> <postgres_container_name> pg_restore -C -d postgres < db.dump
Aussi, vous pouvez utiliser analogique docker-composer de exec. Dans ce cas, vous pouvez utiliser le nom de service court (postgres) au lieu du nom de conteneur complet (composeproject_postgres).
Je viens de valider le conteneur qui exécute la base de données. Ensuite, je pousse cette nouvelle image dans mon registre privé. Quoi qu’il advienne de l’application ou de la base de données, je peux toujours l’extraire de mon registre et l’avoir immédiatement.
docker commit [container-name] [domain:port/'new-image-name']
Puis, après cela, j’affiche l’image dans mon registre.
docker Push [new-image-name]
Si j'ai besoin de restaurer cette base de données, je la retire simplement de mon propre registre comme celui-ci.
docker pull [domain:port/'new-image-name']
Donc, juste pour clarifier, ceci: [domaine: port/'nouveau-image-nom']
Cela ressemblerait à ceci: myregistrydomain.com:5000/dbSep