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)。

08-16 06:57