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
中提及入口点
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