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é ?

61
demandé sur Daniel Serodio 2014-07-13 05:10:38

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
221
répondu Forth 2018-08-28 20:00:03

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à.

10
répondu Carl Levasseur 2014-07-13 12:23:06

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'
4
répondu sjakubowski 2016-11-01 19:06:04