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