docker - 从库/postgres保存数据库状态

标签 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执行 /var/lib/postgresql/data 之后写入VOLUME /var/lib/postgresql/data的所有内容都会消失吗?
但是Dockerfile中的VOLUME命令it seemsdocker 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/

相关文章:

docker - 将持久卷声明添加到容器中的现有文件

docker - 无论如何,没有sudo访问权限就可以启动rsyslogd?

python-2.7 - 初始代码执行后,Docker 容器在代码 0 上退出

linux - 执行 docker pull 后/usr/local/bin 中的“符号链接(symbolic link)级别过多”

linux - docker 容器中的 blktrace 输出错误

docker - 为什么 httpd 容器在 Docker 中立即退出而没有任何错误

node.js - 与 Docker 和 Bitbucket 管道的集成测试

linux - Ubuntu 20.04 : sudo apt-get update not Working

docker - 将额外的 IP 添加到 docker 容器中的 lo 接口(interface)

java - dockerClient.createContainerCMD 未将 Selenium 节点链接到 Hub