【问题标题】:Docker VOLUME command inside Dockerfile not working as expectedDockerfile 中的 Docker VOLUME 命令未按预期工作
【发布时间】:2018-07-19 07:36:25
【问题描述】:
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。

【问题讨论】:

  • 你创建了 docker 镜像了吗?首先创建一个 docker 镜像并运行镜像。确保您在此文件夹 /tmp/foo 中有文件?
  • 尝试将RUN touch... 指令放在VOLUME 指令之后?
  • @JinnaBalu 是的,我已经创建了图像,然后从中弹出一个容器。

标签: docker docker-volume


【解决方案1】:

来自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/

【讨论】:

    【解决方案2】:

    问题在于,使用-v 将外部目录作为卷附加实际上执行绑定挂载:/tmp/foo 目录被挂载到容器的/app/tina 目录。

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

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

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

    但是,这仅适用于特权 (docker run --privileged) 容器(否则您将无法卸载 /app/tina)。

    【讨论】:

    • 是的,这是有道理的。那么,当容器由 docker run 启动时,是否可以将内容复制到绑定挂载?
    • 通常的绑定安装无法做到这一点。但是,有一个选项(由@vladmihaisima 在另一篇文章中提出)使用 docker 卷。使用此选项,Docker 在创建容器时执行这样的复制(从容器到卷)。
    【解决方案3】:

    您的文件已隐藏。这就是坐骑的工作原理。如果我要插入闪存驱动器并将其挂载到~/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 并将“testing tina”放入文件中。

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2015-06-24
      • 1970-01-01
      • 1970-01-01
      • 2018-09-16
      • 2021-11-25
      • 2020-05-23
      • 2016-09-29
      • 2019-10-31
      相关资源
      最近更新 更多