You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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 .

构建逻辑说明:

  1. 第一阶段在/app目录下生成包含子目录test的构建产物;
  2. 第二阶段将第一阶段的/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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.24 01:18:13