Docker Docker 文件中的 VOLUME 命令未按预期工作

Docker VOLUME command inside Dockerfile not working as expected

FROM ubuntu:15.04
RUN mkdir -p /app/tina
RUN touch /app/tina/foo.txt
RUN echo "testing tina" > /app/tina/foo.txt
VOLUME /app/tina
CMD sh

根据Docker指南

This Dockerfile results in an image that causes docker run to create a new mount point at /app/tina and copy the foo.txt file into the newly created volume

但当我这样做时

docker run --rm -it -v /tmp/foo:/app/tina imagename sh
ls /app/tina/

我在里面找不到 foo.txt。

来自https://docs.docker.com/engine/reference/builder/#volume

The VOLUME instruction creates a mount point with the specified name and marks it as holding externally mounted volumes from native host or other containers.

您正在使用 /tmp/foo 这是一个目录,而不是一个卷。尝试:

docker volume create my-vol
docker run --rm -it -v my-vol:/app/tina imagename ls /app/tina/

问题在于,使用 -v 将外部目录附加为卷实际上执行绑定挂载:/tmp/foo 目录挂载到容器的 /app/tina 目录。

在 Linux 中,当您挂载某些东西时,之前在挂载点(/app/tina 在您的情况下)看到的所有文件都变得不可见。因此,当您将 /tmp/foo(空目录)挂载到 /app/tina(其中包含 foo.txt)时,foo.txt 文件变得不可见并且您会看到 /tmp/foo 的内容在 /app/tina 目录中,即 nothing.

您可以确保在 /app/tina 中看到 foo.txt,当您从中卸载 tmp/foo 时:

root@84d8cfad500a:/# ls /app/tina
root@84d8cfad500a:/# umount /app/tina
root@84d8cfad500a:/# ls /app/tina
foo.txt

但是,这仅适用于特权 (docker run --privileged) 容器(否则您将无法卸载 /app/tina)。

您的文件已隐藏。这就是坐骑的工作原理。如果我要插入一个闪存驱动器并将其装载到 ~/someDirectory,那么 ~/someDirectory 中的任何内容都会被新装载中可用的文件所掩盖。 docker 中的卷功能以相同的方式工作。

如果您创建 entrypoint.sh 并将这些行放入入口点

,则可以避免此行为
RUN mkdir -p /app/tina
RUN touch /app/tina/foo.txt
RUN echo "testing tina" > /app/tina/foo.txt

当您创建容器(不是图像)时,docker 创建卷,然后创建 foo.txt 并将 "testing tina" 放入文件。

当然,不要忘记在 Dockerfile

中提及入口点