docker 构建期间出现“只读文件系统”错误

问题描述 投票:0回答:1

我遵循官方文档中的“使用 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 挂载的文件系统,这是否正常?

docker dockerfile debian docker-buildkit
1个回答
0
投票

即使您在 Dockerfile 中使用绑定挂载,它仍然无法将文件写入主机。

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 来处理代码并在主机上创建文件。

© www.soinside.com 2019 - 2024. All rights reserved.