从库/ postgres保存数据库状态

时间:2016-10-26 07:48:18

标签: docker

据我所知,我可以将postgres图片的默认文件夹更改为指向某个卷 - 在这种情况下,显然该卷会持续存在。但我没有这样做,因为我想了解这个图像的默认行为。

所以我只是跑了:

# in one terminal
docker pull postgres
# as a foreground process:
docker run -P --name dev_db postgres

# in another terminal
docker run --rm -it --link dev_db:dev_db /bin/bash
# in this container, I created some databases and added some data to them
# then:
# docker stop dev_db
# docker commit -m "Add data" dev_db postgres_with_data

我认为结果是,新图像postgres_with_data将包含我添加的数据;但事实并非如此。我提交容器时不应该保存吗?如果没有,它去了哪里,我该如何保存呢?

更新

感谢您的回答。因此,如果我理解正确,postgres Dockerfile执行VOLUME /var/lib/postgresql/data后写入/var/lib/postgresql/data的任何内容都会在我停止容器时消失吗?

但是it seems Dockerfile中的VOLUME命令等同于docker run -P --name dev_db -v $(docker volume create):/var/lib/postgresql/data postgres。但我希望当容器停止时,用docker volume create创建的卷实际上不会消失;事实上,我认为即使根据documentation

删除容器,它也不会消失
  

即使容器本身被删除,数据量仍然存在。

我错过了什么?

3 个答案:

答案 0 :(得分:3)

当您运行容器时,Docker会在该容器的图像层之上放置一个可写文件系统层 - 如果您在可写层中进行任何更改并将容器提交到新图像,那么您所做的更改保留在新图像中。

但是postgres图像存储卷中的数据库文件,而不是可写层中的数据库(请参阅Dockerfile) - 所以当您更改数据库数据时,那么容器外面的数据&# 39;可写层和变化不会持续存在。

如果你这样做了:

docker run --name c1 postgres touch /new.txt
docker commit c1 postgres-new

然后postgres-new图片将包含新文件,因为它已添加到容器的文件系统而不是卷。

答案 1 :(得分:3)

我不知道是否为时已晚但是如果您希望数据在docker容器中保留,您可以将pgdata dir指向现在指向的任何位置...因此不会查看卷而不是重置:

docker run -e PGDATA = / var / lib / postgresql / pgdata

而不是PGDATA = / var / lib / postgresql / data

在FROM库/ postgres上为我工作:9.5回购。

答案 2 :(得分:2)

您对数据库所做的更改将保存在容器认为是临时的容器的一部分中,因此在提交映像时不会保留。保持这些更改的唯一方法是将此文件夹挂载到卷上,并在运行postgres容器时重复使用。