在 docker 容器中保留数据文件

Persist Data files in docker container

这应该不难,但我想不通。我有一个容器 运行ning 并在 docker 运行 命令中使用了 -v /tester。然后我做 docker exec ti containername /bin/bash。然后我用 vi /tester/stayhere.txt 创建了一个名为 /tester/stayhere.txt 的文件。然后我保存文件并验证它在那里。然后我做了一个 docker 提交并启动了新图像并且 stayhere.txt 丢失了。我做错了什么?

我不能说,如果你没有确切的命令 运行。我猜你实际上并没有以某种方式启动 'new' 图像。我认为那是因为你 "starting" 它与 docker exec (它在 运行 容器中启动)而不是 docker run

不过,更一般地说,我建议 change-and-commit 是不好的做法。你真正应该做的是构建你的东西​​的任何事情,你应该在构建时做(使用 Dockerfile)。

任何持久状态的东西,你都应该挂载到你的容器中——要么通过卷挂载,要么通过存储容器。

创建其中之一非常容易:

docker create -v /path/to/data --name my_storage_container base-image-name /bin/true

然后从干净的构建映像启动容器:

docker run -it --volumes-from my_storage_container image /bin/bash

无论您将图像弄得多么乱,您保存的文件都应该会保留下来。

当您使用 -v 在 docker 容器中安装卷时,它不被视为容器本身的一部分。这就是为什么当您提交更改时它丢失了。

根据 Docker 文档:

A data volume is a specially-designated directory within one or more containers that bypasses the Union File System.

并且:

Volumes are initialized when a container is created. If the container’s base image contains data at the specified mount point, that existing data is copied into the new volume upon volume initialization.

这意味着,数据量存在于 Union Filesystem 之外,即使您删除该容器数据量仍然存在:

Data volumes are designed to persist data, independent of the container’s life cycle. Docker therefore never automatically delete volumes when you remove a container, nor will it “garbage collect” volumes that are no longer referenced by a container.

因此它们不是您的 docker 提交命令的一部分。

为了实现您想要的效果,您需要在镜像中 未安装 的 docker 卷中将文件复制到同一路径。您可以使用 Dockerfile 或直接启动容器并更改文件系统然后提交。

下次启动容器时 你应该能够看到这些文件。