【问题标题】:Docker run --mount make all files available in a different folder during RUNDocker run --mount 在 RUN 期间使所有文件在不同的文件夹中可用
【发布时间】:2020-04-23 06:24:21
【问题描述】:

我想在RUN 语句期间使我的主机上的一个文件夹可用。也就是类似于用-v运行容器的效果:

docker run -v /path/on/host:/path/in/container mycontainer:tag

在容器中,这给了我/path/in/container 以及path/on/host 中的所有文件/文件夹。

为此,我正在尝试https://github.com/moby/buildkit/blob/master/frontend/dockerfile/docs/experimental.md 的实验性挂载选项:

RUN --mount=type=bind,target=/path/on/host

这在RUN 期间给了我一个文件夹/path/on/host

然后我有两个问题:

  1. 我可以在/path/on/host 中使用ls 文件,但不能使用它们(例如cat 它们)。我尝试将 type 更改为例如cache 并使用 source 就像在 https://devops.stackexchange.com/questions/6078/in-a-dockerfile-is-there-a-way-to-avoid-copying-files-to-make-them-accessible-t 中一样,但我无法让它工作。

  2. 我不知道如何在“RUN 图像”中使用不同的路径,即/path/in/container 而不是/path/on/host

【问题讨论】:

    标签: docker dockerfile docker-buildkit


    【解决方案1】:

    我认为您误解了 RUN --mount=type=bind... 语法的用途。来自文档:

    此挂载类型允许将上下文或映像中的目录(只读)绑定到构建容器。

    换句话说,这不允许您在构建阶段访问任意主机目录。它不是类似于docker run 上的-v 命令行选项。它只允许您:

    • 从构建上下文中装载目录,或者
    • 在多阶段构建中从另一个阶段装载目录

    例如,我可以这样做,将目录从一个构建阶段安装到后续构建阶段:

    # syntax=docker/dockerfile:experimental
    
    FROM centos AS centos
    
    FROM alpine
    RUN --mount=type=bind,from=centos,source=/,target=/centos ls /centos > /root/centos.txt
    

    或者,如果我在构建上下文中有一个名为 example 的目录,我可以这样做以在构建过程中挂载它:

    # syntax=docker/dockerfile:experimental
    
    FROM centos AS centos
    
    FROM alpine
    RUN --mount=type=bind,source=example,target=/data cp /data/* /root/
    

    您正在使用的语法(未指定 from)...

    RUN --mount=type=bind,target=/path/on/host
    

    ...只需将构建上下文的根安装在容器内的/path/on/host 上。请记住,target 指定了安装点在容器内。例如,如果我的构建上下文如下所示:

    .
    ├── Dockerfile
    └── example
        └── README.md
    

    example/README.md 包含:

    This is a test.
    

    Dockerfile 包含一个 RUN 选项,类似于您正在使用的选项:

    # syntax=docker/dockerfile:experimental
    
    FROM centos AS centos
    
    FROM alpine
    RUN --mount=type=bind,target=/data cat /data/example/README.md > /root/README.md
    

    那么当构建镜像时,/root/README.md 的内容为example/README.md

    【讨论】:

    • 你说得对——我误解了文档。感谢您的澄清!我想没有办法做我正在寻找的坐骑?
    • 嗨,非常感谢您澄清功能和文档!就我而言,source 有问题,我错过了与上下文相关的来源,因此我得到了failed to compute cache key: "/Users/bric3/opensource/panama-foreign" not found: not found。顺便说一句,# syntax=docker/dockerfile:experimental 在最近的 docker 版本中不再需要。
    • 在 Dockerfile 构建期间docker build -v ... 不适合您吗?在我看来它会起作用。
    • 至少根据手册页和docker build --helpdocker build 没有-v 选项。
    猜你喜欢
    • 2019-07-20
    • 2020-12-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-08-18
    • 1970-01-01
    • 2021-03-06
    相关资源
    最近更新 更多