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

rob*_*tdj 2 docker dockerfile docker-buildkit

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

docker run -v /path/on/host:/path/in/container mycontainer:tag
Run Code Online (Sandbox Code Playgroud)

在容器中,这为我/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 Code Online (Sandbox Code Playgroud)

/path/on/hostRUN.

然后我有两个问题:

  1. 我可以ls在里面文件/path/on/host,但不能使用它们(例如cat它们)。我试图改变type到如cache使用sourcehttps://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.

lar*_*sks 10

我认为您误解了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
Run Code Online (Sandbox Code Playgroud)

或者,如果我example在构建上下文中命名了一个目录,则可以在构建过程中执行此操作以挂载它:

# syntax=docker/dockerfile:experimental

FROM centos AS centos

FROM alpine
RUN --mount=type=bind,source=example,target=/data cp /data/* /root/
Run Code Online (Sandbox Code Playgroud)

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

RUN --mount=type=bind,target=/path/on/host
Run Code Online (Sandbox Code Playgroud)

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

.
??? Dockerfile
??? example
    ??? README.md
Run Code Online (Sandbox Code Playgroud)

example/README.md包含:

This is a test.
Run Code Online (Sandbox Code Playgroud)

并且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
Run Code Online (Sandbox Code Playgroud)

然后在构建图像时,/root/README.md具有example/README.md.

  • 可能值得一提的是,docker 使用“--build-context flag”支持来自主机的多个构建上下文:https://www.docker.com/blog/dockerfiles-now-support-multiple-build-contexts/ 。因此,您应该能够指定要作为单独的“--build-context”安装的任何主机目录,然后使用它。例如“docker build --build-context mydir=/myhostdir”,然后在 Dockerfile 中执行“RUN --mount=type=bind,from=mydir,target/whatever”。 (2认同)