代码之家  ›  专栏  ›  技术社区  ›  Mr Coder

Dockerfile中的Docker VOLUME命令未按预期工作

  •  3
  • Mr Coder  · 技术社区  · 6 年前
    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 回复  |  直到 6 年前
        1
  •  1
  •   Danila Kiver    6 年前

    问题是将外部目录附加为卷时使用 -v 实际执行绑定装载: /tmp/foo 目录被装载到 /app/tina 容器的目录。

    在Linux中,当您装载某些东西时,所有以前在装载点中看到的文件( /应用程序/Tina 在你的情况下)变得看不见所以,当你登上 /tmp/食品 (空目录)到 /应用程序/Tina (其中包含 foo.txt )中的 foo.txt文件 文件变为不可见,您将看到 /TMP/食品 /应用程序/Tina 目录,即。 没有什么 是的。

    你可以确保你会看到 foo.txt文件 在里面 /应用程序/tina 当你要卸下 tmp/foo 从中:

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

    然而,这只适用于特权阶层( docker run --privileged )容器(否则您将无法卸载 /应用程序/Tina )中。

        2
  •  2
  •   vladmihaisima    6 年前

    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/
    
        3
  •  1
  •   Bukharov Sergey    6 年前

    你的文件被隐藏了。这就是坐骑的工作原理。如果我要插入一个闪存驱动器并将其安装到 ~/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 把“测试蒂娜”放到文件里。

    当然,别忘了提到入口点 Dockerfile