我遵循官方文档中的“使用 Docker 构建”指南(https://docs.docker.com/build/guide/test/),该指南表明可以在构建过程中利用绑定挂载来生成文件Docker 镜像并将其导出到文件系统。
但是,我遇到了以下错误:
[lint-base 2/2] RUN --mount=type=bind,target=. echo "test" > lint-result:
0.258 /bin/sh: 1: cannot create lint-result: Read-only file system
...
ERROR: failed to solve: process "/bin/sh -c echo \"test\" > lint-result" did not complete successfully: exit code: 2
这是 Dockerfile 的相关部分:
FROM scratch as lint-base
RUN --mount=type=bind,target=. \
echo "test" > lint-result
这是构建这一层的命令:
docker build --output=. --target=lint-base -t lint-debug --progress=plain .
我使用的是 Debian,Docker 是使用 apt 安装的。 Docker 版本是
25.0.4
。
这个权限问题是否源于我安装 Docker 的方式,或者在 docker 构建过程中,不允许将更改写入通过 bind 挂载的文件系统,这是否正常?
即使您在 Dockerfile 中使用绑定挂载,它仍然无法将文件写入主机。
RUN --mount=type=bind
文档注释
绑定挂载默认是只读的。
这与您收到的“只读文件系统”错误一致。还有一个附加选项可以使其可读,但是(强调我的)
、rw
:允许在挂载上写入。 写入的数据将被丢弃。readwrite
您链接到的文档页面确实表示您可以导出测试结果
...与导出二进制文件没有什么不同,如本指南上一节所示
更具体地说,Export binaries文档建议了一个
docker build --output=.
选项,该选项可以使用Docker映像生成器,但通过导出容器文件系统在主机上生成工件。如果镜像已构建FROM scratch
,那么“容器文件系统”将仅包含您选择的特定文件。这也意味着该映像根本不包含任何工具,因此您必须在早期构建阶段构建文件并将它们COPY
放入最终映像中。
对于您的示例,这可能看起来像:
FROM ubuntu AS build
WORKDIR /app
RUN echo test > lint-result
FROM scratch AS export
COPY --from=build /app/lint-result /
docker build --output=. --target=export .
我可能不会在这里使用 Docker,而是使用 shell 脚本或 Makefile 来处理代码并在主机上创建文件。