Docker 4.29+输出含子目录时BuildKit报'context canceled'错误求助
Docker Desktop 4.29+/Windows(Linux容器)多阶段构建导出含子目录产物失败报错
context canceled 问题概述
团队使用多阶段Dockerfile结合Docker BuildKit的自定义构建输出功能,运行环境为Docker Desktop for Windows(Linux容器模式)。自Docker 4.29版本起(4.30版本仍存在该问题),当构建产物包含子目录时,执行导出到本地目录的构建会失败,报错:
ERROR: failed to solve: error from receiver: context canceled
复现步骤
最简Dockerfile示例
FROM alpine WORKDIR /app RUN mkdir test RUN touch test/mytestfile FROM scratch COPY --from=0 /app .
构建逻辑说明:
- 第一阶段在
/app目录下生成包含子目录test的构建产物; - 第二阶段将第一阶段的
/app目录内容导出到本地。
执行的构建命令
docker build --no-cache --output . .
预期与实际行为
- 预期:本地工作目录生成
test/mytestfile文件及对应目录结构; - 实际:本地仅创建空的
test目录,构建被取消并触发上述错误,完整日志如下:
[+] Building 4.4s (9/9) FINISHED docker:default => [internal] load build definition from Dockerfile 0.0s => => transferring dockerfile: 143B 0.0s => [internal] load metadata for docker.io/library/alpine:latest 1.5s => [internal] load .dockerignore 0.0s => => transferring context: 2B 0.0s => [stage-0 1/4] FROM docker.io/library/alpine:latest@sha256:c5b1261d6d3e43071626931fc004f70149baeba2c8ec672bd4f27761f8e1ad6b 2.0s => => resolve docker.io/library/alpine:latest@sha256:c5b1261d6d3e43071626931fc004f70149baeba2c8ec672bd4f27761f8e1ad6b 0.0s => => sha256:c5b1261d6d3e43071626931fc004f70149baeba2c8ec672bd4f27761f8e1ad6b 1.64kB / 1.64kB 0.0s => => sha256:6457d53fb065d6f250e1504b9bc42d5b6c65941d57532c072d929dd0628977d0 528B / 528B 0.0s => => sha256:05455a08881ea9cf0e752bc48e61bbd71a34c029bb13df01e40e3e70e0d007bd 1.47kB / 1.47kB 0.0s => => sha256:4abcf20661432fb2d719aaf90656f55c287f8ca915dc1c92ec14ff61e67fbaf8 3.41MB / 3.41MB 1.8s => => extracting sha256:4abcf20661432fb2d719aaf90656f55c287f8ca915dc1c92ec14ff61e67fbaf8 0.1s => [stage-0 2/4] WORKDIR /app 0.1s => [stage-0 3/4] RUN mkdir test 0.3s => [stage-0 4/4] RUN touch test/mytestfile 0.3s => [stage-1 1/1] COPY --from=0 /app . 0.0s => CANCELED exporting to client directory 0.0s => => copying files 56B 0.0s ERROR: failed to solve: error from receiver: context canceled
已尝试的无效方案
- 在
scratch阶段显式创建目录并设置权限; - 提前在主机创建目标输出目录;
- 修改构建命令为
docker build --output ./test .; - 替换最终阶段镜像(原Docker 4.28版本使用
scratch正常); - 添加
--progress=plain参数未获取更多有效信息。
备注:若移除子目录(将Dockerfile中RUN mkdir test和RUN touch test/mytestfile替换为RUN touch mytestfile),构建可正常完成,本地生成预期文件,但实际场景中构建产物包含子目录无法避免,难以重构。
临时可行方案(不希望采用)
使用type=tar导出为压缩包,命令如下:
docker build --output type=tar,dest=out.tar .
此命令可生成包含完整目录结构的tar包,但会增加解压步骤,污染构建流水线,不符合需求。
求助点
该问题从Docker 4.29版本引入,未在官方发布说明中找到相关内容,不确定是否是配置用法有误,希望得到技术人士的帮助。
内容的提问来源于stack exchange,提问作者AHowgego
相关产品推荐
相关产品推荐

