从库/ postgres保存数据库状态

据我所知,我可以更改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将包含我添加的数据; 但事实并非如此。 当我提交容器时不应该保存吗? 如果不是的话,它到底在哪里,我该如何保存?

更新

感谢您的答案。 所以如果我理解正确的话,当我停止容器时,任何写入到/var/lib/postgresql/data postgres Dockerfile执行VOLUME /var/lib/postgresql/data消失吗?

但似乎 Dockerfile中的VOLUME命令相当于docker docker run -P --name dev_db -v $(docker volume create):/var/lib/postgresql/data postgres 。 但是我希望当容器停止时,使用docker volume create实际上并不会消失; 实际上,我认为即使根据文档删除容器,它也不会消失:

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

我错过了什么?

当你运行一个容器时,Docker会在该容器的图像层之上放置一个可写的文件系统层 – 如果你在可写层中做了任何改变,并将容器提交给一个新的图像,你所做的改变被保存在新图片。

但是, postgres镜像将数据库文件存储在一个卷中,而不是在可写入层(请参阅Dockerfile )中 – 因此,当您更改数据库数据时,它位于容器的可写层之外,并且更改不会持久化。

如果你这样做:

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

然后postgres-new图像将有新的文件,因为它被添加到容器的文件系统而不是一个卷。

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

我不知道是否为时已晚,但是如果您希望数据在Docker容器内持久存在,则可以将pgdata目录指向任何位置,而不必指向现在指向的位置…因此不会查看卷并且不会重置:

docker运行-e PGDATA = / var / lib / postgresql / pgdata

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

适用于我的FROM库/ postgres:9.5回购。