我已经下载了一个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.
创建新容器。如果我用新图像启动新容器并检查我编辑的配置文件,我的更改不存在。没有进行任何更改。
我在这里做错了什么?
答案 0 :(得分:2)
Docker文件包含一个卷声明
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
我一直在使用这种技术生成数据库图像以进行测试,以加快反馈循环。