在 Docker 中挂载卷并保存镜像中的数据

在 Docker 中挂载卷并保存镜像中的数据

任务:保存容器时需要将文件从镜像保存到主机,前提是要挂载的文件夹是空的。例如,mongodb 镜像(来自文档)也可以工作。

docker run --name some-mongo -v /my/own/datadir:/data/db -d mongo

我测试了这个结构(我在 Windows 下工作),它工作正常,数据库保存在主机上。尝试在我的图像上采用类似的方案,我在容器中得到一个空文件夹,来自图像的数据完全重叠。我用 Dockerfile 和 VOLUME 做了各种测试,结果总是相同的。Dockerfile 示例:

FROM ubuntu
RUN mkdir /myfolder
RUN echo "hello world" > /myfolder/greeting
VOLUME /myfolder

我构建了一个图像,启动了容器,等待获取 D:/Docker/ 中文件夹 /myfolder 的内容,但没有文件。

docker run -it -v D:/Docker:/myfolder -d app

文件夹是空的...

答案1

RUN 命令在镜像构建期间执行,因此其输出是定义镜像的文件系统的一部分。容器运行时将使用您的卷:

mkdir /tmp/volume
docker run -v /tmp/volume:/volume ubuntu touch /volume/proof.dat

/tmp/volume/proof.dat在主机系统上创建一个文件。

因此,您的应用程序很可能没有写入/data/db。一旦容器启动,您就可以使用:

docker exec -it {container} bash

在容器环境中执行命令并检查其中有哪些文件。您也可以启动容器而不-d查看应用程序日志(或使用docker logs来获取输出)。

相关内容