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

时间:2017-01-02 15:06:45

标签: bash postgresql docker

我已经下载了一个postgresql docker镜像,目前正在编辑一些配置文件。我遇到的问题是,每当我编辑配置文件并提交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.

创建新容器。如果我用新图像启动新容器并检查我编辑的配置文件,我的更改不存在。没有进行任何更改。

我在这里做错了什么?

2 个答案:

答案 0 :(得分:2)

Docker文件包含一个卷声明

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

VOLUME /var/lib/postgresql/data

此路径下的所有文件编辑都不会保存在Docker镜像提交中。这些数据文件是故意排除的,因为它们定义了容器的状态。另一方面,图像旨在创建新容器,因此VOLUME是一种保持状态分离的机制。

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

答案 1 :(得分:0)

正如Mark正确地指出的那样,由于卷定义,您的数据会被遗忘,并且不应针对一般生产用途进行更改。

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

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

我一直在使用这种技术生成数据库图像以进行测试,以加快反馈循环。