备份/恢复一个dockerized PostgreSQL数据库

我正在尝试备份/恢复一个PostgreSQL数据库,正如在Docker网站上所解释的那样,但数据不会被恢复。

数据库映像使用的卷是:

VOLUME ["/etc/postgresql", "/var/log/postgresql", "/var/lib/postgresql"] 

而CMD是:

 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"] 

我用这个命令创build了数据库容器:

 docker run -it --name "$DB_CONTAINER_NAME" -d "$DB_IMAGE_NAME" 

然后我连接另一个容器手动插入一些数据:

 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> 

然后创buildtar档案:

 $ 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 

现在我删除用于数据库的容器,并创build另一个具有相同名称的容器,并尝试恢复之前插入的数据:

 $ sudo docker run --volumes-from "$DB_CONTAINER_NAME" --rm -v $(pwd):/backup ubuntu tar xvf /backup/backup.tar 

但表格是空的,为什么数据没有被正确地恢复?

备份您的数据库

docker exec -t your-db-container pg_dumpall -c -U postgres > dump_`date +%d-%m-%Y"_"%H_%M_%S`.sql

恢复你的数据库

cat your_dump.sql | docker exec -i your-db-container psql -U postgres

好的,我明白了这一点。 Postgresql一旦启动,就不会检测文件夹/ var / lib / postgresql的更改,至less不会检测到我想要的更改。

第一个解决scheme是用bash启动容器,而不是直接启动postgres服务器,恢复数据,然后手动启动服务器。

第二个解决scheme是使用数据容器。 我以前没有明白这一点,现在我知道了。 这个数据容器允许在启动postgres容器之前恢复数据。 因此,当postgres服务器启动时,数据已经在那里。

另一种方法(基于docker-postgresql-workflow )

本地运行的数据库(不在docker中,但是同样的方法可以)导出:

 pg_dump -F c -h localhost mydb -U postgres export.dmp 

要导入的容器数据库:

 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'