从库/ 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回购。
- 通过ssh转发x11后台会发生什么?
- 删除具有依赖儿童图像的docker图像
- Docker与Django组合:'ascii'编解码器无法解码位置7中的字节0xcd:序号不在范围内(128)
- 你能控制Dockerfile中的Docker运行参数吗?
- Dockerizing简单的webbapp:如何挑选哪些容器?
- AWS ECS领导者命令(django migrate)
- Docker或Vagrant会帮助我们为企业产品创buildtesting机器吗?
- 如果你只有一个Java应用程序的shell安装程序,你如何构build一个docker镜像?
- 通过脚本将dockerfile中的环境variables传递给dockerfile