docker - Docker run --mount 在 RUN 期间使所有文件在不同的文件夹中可用
问题描述
我想在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
。
然后我有两个问题:
我可以
ls
在里面归档/path/on/host
,但不能使用它们(例如cat
它们)。我尝试在https://devops.stackexchange.com/questions/6078/in-a-dockerfile-is-there-a-way-to-avoid-copying-files-to-make-type
中更改为 egcache
并使用source
like them-accessible-t,但我无法使其工作。我无法弄清楚如何在“
RUN
图像”中有不同的路径,也就是说,/path/in/container
而不是/path/on/host
.
解决方案
我认为您误解了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
.