任务:保存容器时需要将文件从镜像保存到主机,前提是要挂载的文件夹是空的。例如,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
来获取输出)。