Docker run --mount 使所有文件在 RUN 期间在不同的文件夹中可用



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

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

在容器中,这让我/path/in/containerpath/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/hostls文件,但不能使用它们(例如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.

我想你误解了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的内容。

相关内容

最新更新