保存docker状态(例如,编辑postgresql.conf文件)

我已经下载了一个postgresql泊坞窗图像,并在编辑一些configuration文件。 我有的问题是,每当我编辑configuration文件并提交docker图像(保存为一个新的),它永远不会保存任何东西。 该图像仍然是我下载的相同。

我正在使用的图片: https : //hub.docker.com/_/postgres/

我相信这是最新的docker文件。 https://github.com/docker-library/postgres/blob/a00e979002aaa80840d58a5f8cc541342e06788f/9.6/Dockerfile

这就是我所做的:

1. Run the postgresql docker container 2. Enter the terminal of the container. docker exec -i -t {id of container} /bin/bash 3. Edit some config files. 4. Exit the container. 5. Commit the changes by using docker commit {containerid} {new name} 6. Stop the old container and start the new one. 

新的容器被创build。 如果我用新的图像启动新的容器,并检查我编辑的configuration文件,我的更改不存在。 没有更改提交。

我在这里做错了什么?

Docker文件包含一个卷声明

https://github.com/docker-library/postgres/blob/a00e979002aaa80840d58a5f8cc541342e06788f/9.6/Dockerfile#L52

 VOLUME /var/lib/postgresql/data 

此path下的所有文件编辑将不会保存在Docker镜像提交中。 这些数据文件在定义您的容器状态时被故意排除。 另一方面,图像是为了创造新的容器而devise的,所以VOLUME是一种保持状态分离的机制。

这似乎是你试图使用Docker镜像作为数据库备份和恢复的机制。 这是不明智的,因为与通常暴露给卷的本地文件系统相比,泊坞窗文件系统性能较差。

正如Mark正确地指出的那样,由于卷的定义,数据被遗忘了,不应该为一般的生产使用而改变。

如果您有合法的理由将数据保存在生成​​的映像中,则可以通过将以下内容添加到dockerfile中来移动卷中的postgres数据:

  ENV PGDATA /var/lib/postgresql/my_data RUN mkdir -p $PGDATA 

我一直在使用这种技术来产生用于testing的数据库图像,以加速反馈循环。