Docker run --mount使所有文件在运行期间位于不同的文件夹中

问题描述 投票:0回答:1

我想在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

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

然后我有两个问题:

  1. 我可以在ls中保存/path/on/host个文件,但不使用它们(例如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个回答
0
投票

我认为您误解了RUN --mount=type=bind...语法的含义。从文档中:

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

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

    从构建上下文中挂载目录,或

  • 在多阶段构建中从另一个阶段装载目录
  • 因此,例如,我可以这样做,将目录从一个构建阶段挂载到随后的构建阶段:

    # 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的内容。
  • © www.soinside.com 2019 - 2024. All rights reserved.