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

Docker开启BuildKit时,glob条件复制node_module[s]报错如何解决?

Docker BuildKit启用时复制node_modules出现无关错误

我的Dockerfile包含以下代码:

# [s]用于允许文件夹不存在
# 这并非最佳实践,但可复用已下载的包
# 我们更关注节省带宽
COPY package.json node_module[s]/ ./

构建现象

  • 执行DOCKER_BUILDKIT=0 docker compose build:无论本地是否存在node_modules文件夹,构建均正常完成。
  • 执行DOCKER_BUILDKIT=1 docker compose build:
    • 本地无node_modules时,构建正常;
    • 本地存在node_modules时,触发无关错误:

      failed to solve: failed to compute cache key: failed to calculate checksum of ref cf300a02-19ca-4a07-951f-080a0c0ef0b0::x8jv3lm9rqctbwfjb6qsha2kk: "/usr/bin/python3": not found

我的Docker版本:

$ docker -v
Docker version 24.0.7, build 24.0.7-0ubuntu2~22.04.1

解决方案

  1. 废弃括号通配的条件复制写法
    BuildKit对通配符的解析逻辑和传统构建引擎差异较大,node_module[s]这种写法会触发意外的文件扫描,导致错误。建议用构建参数实现可控的依赖复用:
# 定义构建参数,默认不复制本地node_modules
ARG COPY_LOCAL_NODE_MODULES=false

# 先复制依赖描述文件
COPY package.json package-lock.json ./

# 容器内安装依赖
RUN npm install

# 仅当构建参数为true时,复制本地node_modules覆盖容器内的
COPY --condition=$COPY_LOCAL_NODE_MODULES node_modules/ ./node_modules/

构建时通过docker compose build --build-arg COPY_LOCAL_NODE_MODULES=true启用本地依赖复用。

  1. 优先使用容器内安装依赖
    本地node_modules可能包含系统特定二进制文件(比如Python相关编译产物),复制到容器易引发兼容问题。配合Docker缓存机制,把COPY package.json package-lock.json ./放在RUN npm install之前,只有依赖文件变更时才会重新安装,同样能节省重复构建的带宽和时间。

  2. 调整通配符写法(不推荐)
    如果坚持用类似条件复制,可将node_module[s]/改为node_modules*/,但这种写法仍存在BuildKit校验逻辑触发意外问题的风险,不建议长期使用。

内容的提问来源于stack exchange,提问作者plswork04

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.17 01:26:20