Dockerfile中的Docker VOLUME命令无法按预期运行

时间:2018-07-19 07:36:25

标签: docker docker-volume

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指南

  

此Dockerfile生成一个图像,该图像导致docker run创建一个   / app / tina上的新挂载点,并将foo.txt文件复制到新   创建的音量

但是当我这样做

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

我在其中找不到foo.txt。

3 个答案:

答案 0 :(得分:2)

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

  

VOLUME指令创建具有指定名称的安装点,并将其标记为从本地保存外部安装的卷   主机或其他容器。

您正在使用/ tmp / foo,它是目录,而不是卷。试试:

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

答案 1 :(得分:1)

问题是,使用-v将外部目录作为卷附加实际上执行了绑定安装:/tmp/foo目录已安装到容器的/app/tina目录。

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

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

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

但是,这仅在特权(docker run --privileged)容器中有效(否则,您将无法卸载/app/tina)。

答案 2 :(得分:1)

您的文件被隐藏。这就是挂载的工作原理。如果要插入闪存驱动器并将其安装到~/someDirectory,则~/someDirectory中的所有内容都将被新安装中可用的文件掩盖。 docker中的卷功能以相同的方式工作。

如果创建entrypoint.sh并将这些行放入入口点,则可以避免这种行为

RUN mkdir -p /app/tina
RUN touch /app/tina/foo.txt
RUN echo "testing tina" > /app/tina/foo.txt

在创建容器(而非图像)时,泊坞窗创建卷,并在创建foo.txt之后将“ testing tina”放入文件中。

当然,不要忘记在Dockerfile中提及入口点