我想在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
个文件)。我曾尝试将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,但我无法使其工作。
我不知道如何在“ 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
的内容。