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指南
但是当我这样做
docker run --rm -it -v /tmp/foo:/app/tina imagename sh
ls /app/tina/
我在其中找不到foo.txt。
最佳答案
问题在于,使用-v
将外部目录作为卷附加实际上执行了绑定(bind)安装:/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
)。