据我所知,我可以将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
即使容器本身被删除,数据量仍然存在。
我错过了什么?
答案 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容器时重复使用。