如何在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