Sauvegarde / restauration d'une base de données PostgreSQL dockerisée
J'essaie de sauvegarder / restaurer une base de données PostgreSQL comme expliqué sur le site Web Docker, mais les données ne sont pas restaurées.
Les volumes utilisés par l'image de base de données sont:
VOLUME ["/etc/postgresql", "/var/log/postgresql", "/var/lib/postgresql"]
Et le CMD est:
CMD ["/usr/lib/postgresql/9.3/bin/postgres", "-D", "/var/lib/postgresql/9.3/main", "-c", "config_file=/etc/postgresql/9.3/main/postgresql.conf"]
Je crée le conteneur DB avec cette commande:
docker run -it --name "$DB_CONTAINER_NAME" -d "$DB_IMAGE_NAME"
Ensuite, je connecte un autre conteneur pour insérer des données manuellement:
docker run -it --rm --link "$DB_CONTAINER_NAME":db "$DB_IMAGE_NAME" sh -c 'exec bash'
psql -d test -h $DB_PORT_5432_TCP_ADDR
# insert some data in the db
<CTRL-D>
<CTRL-D>
L'archive tar est alors créée:
$ sudo docker run --volumes-from "$DB_CONTAINER_NAME" --rm -v $(pwd):/backup ubuntu tar cvf /backup/backup.tar /etc/postgresql /var/log/postgresql /var/lib/postgresql
Maintenant, je supprime le conteneur utilisé pour la base de données et en crée un autre, avec le même nom, et essayez de restaurer les données insérées avant:
$ sudo docker run --volumes-from "$DB_CONTAINER_NAME" --rm -v $(pwd):/backup ubuntu tar xvf /backup/backup.tar
, Mais les tables sont vides, pourquoi les données ne sont pas correctement restauré ?
3 réponses
Sauvegardez vos bases de données
docker exec -t your-db-container pg_dumpall -c -U postgres > dump_`date +%d-%m-%Y"_"%H_%M_%S`.sql
Restaurez vos bases de données
cat your_dump.sql | docker exec -i your-db-container psql -U postgres
OK, j'ai compris. Postgresql ne détecte pas les changements dans le dossier /var / lib / postgresql une fois qu'il est lancé, du moins pas le genre de changements que je veux qu'il détecte.
La première solution consiste à démarrer un conteneur avec bash au lieu de démarrer directement le serveur postgres, à restaurer les données, puis à démarrer le serveur manuellement.
La deuxième solution consiste à utiliser un conteneur de données. Je n'avais pas compris le but avant, maintenant je le sais. Ce conteneur de données permet de restaurer données avant de démarrer le conteneur postgres. Ainsi, lorsque le serveur postgres démarre, les données sont déjà là.
Une Autre approche (basée sur docker-postgresql-workflow)
Base de données locale en cours D'exécution (pas dans docker, mais la même approche fonctionnerait) pour exporter:
pg_dump -F c -h localhost mydb -U postgres export.dmp
Base de données de conteneurs à importer:
docker run -d -v /local/path/to/postgres:/var/lib/postgresql/data postgres #ex runs container as `CONTAINERNAME` #find via `docker ps`
docker run -it --link CONTAINERNAME:postgres --volume $PWD/:/tmp/ postgres bash -c 'exec pg_restore -h postgres -U postgres -d mydb -F c /tmp/sonar.dmp'