如何在Docker中备份数据库

我正在运行我的应用程序使用docker-compose与下面的yml文件

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: 

正如你在这里看到的,我使用一个named volume来pipe理postgres状态。

根据官方文档,我可以像下面那样备份一个音量

 docker run --rm --volumes postgresdata:/var/lib/postgresql/data -v $(pwd):/backup ubuntu tar cvf /backup/backup.tar /dbdata 

其他一些教程build议我使用postgres提供的pg-dump函数进行备份。

 pg_dump -Fc database_name_here > database.bak 

我想我将不得不去进入postgres容器执行此function,并将备份目录挂载到主机。

一种方法比另一种更好吗?

要运行pg_dump,你可以使用docker exec命令:

备份:

docker exec -u <your_postgres_user> <postgres_container_name> pg_dump -Fc <database_name_here> > db.dump

删除数据库(不要在生产上做,只能用于testing!!!):

docker exec -u <your_postgres_user> <postgres_container_name> psql -c 'DROP DATABASE <your_db_name>'

恢复:

docker exec -i -u <your_postgres_user> <postgres_container_name> pg_restore -C -d postgres < db.dump

你也可以使用docker-compose类似的exec。 在这种情况下,您可以使用短服务名称(postgres)而不是完整的容器名称(composeproject_postgres)。

docker执行官

docker执行官

那么pg_restore