我了解我可以将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执行
/var/lib/postgresql/data
之后写入VOLUME /var/lib/postgresql/data
的所有内容都会消失吗?但是Dockerfile中的
VOLUME
命令it seems与docker run -P --name dev_db -v $(docker volume create):/var/lib/postgresql/data postgres
等效。但是我希望当容器停止时,用docker volume create
创建的卷实际上不会消失。实际上,我假设即使根据documentation删除了容器,它也不会消失:Data volumes persist even if the container itself is deleted.
我想念什么?
最佳答案
运行容器时,Docker在该容器的图像层之上放置一个可写文件系统层-如果您在可写层中进行了任何更改并将该容器提交到新图像,则您所做的更改将被保留在新图像中。
但是postgres
镜像将数据库文件存储在一个卷中,而不是在可写层中(请参阅Dockerfile)-因此,当您更改数据库数据时,该数据不在容器的可写层之内,并且更改不会持久化。
如果您改为这样做:
docker run --name c1 postgres touch /new.txt
docker commit c1 postgres-new
然后
postgres-new
图像将具有新文件,因为它是添加到容器的文件系统中而不是添加到卷中的。
关于docker - 从库/postgres保存数据库状态,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40256545/