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

GitHub Actions复制生成目录到Docker镜像时出错问题排查

问题分析与解决办法

嘿,这个问题我之前也碰到过,来帮你拆解下核心原因和对应的解决办法:

为什么会出现这个问题?

最常见的原因有两个:

1. .dockerignore 把 node_modules 给排除了

这大概率是你遇到的情况。如果项目根目录里有 .dockerignore 文件,而且里面写了 node_modules,那执行 docker build 时,Docker会自动跳过这个目录,根本不会把它加入到构建上下文里。哪怕你的GitHub Actions工作目录里明明有 node_modules,Docker daemon也看不到它,自然就会报错说找不到这个目录。

而 package.json 和 src 能正常复制,是因为它们在Git仓库里,而且一般不会被 .dockerignore 排除,所以Docker能在构建上下文里找到它们。

2. 工作流的目录隔离(可能性较低)

虽然同一个GitHub Actions工作流的step默认共享同一个工作目录,但如果你用了某些特殊的Action或者配置,导致生成 node_modules 的步骤和构建Docker镜像的步骤不在同一个目录下,也会出现这个问题。不过从你提供的步骤来看,你在 npm run build 后立刻用 ls -al 确认了 node_modules 存在,然后马上执行 docker build,这种情况概率很低。

怎么解决?

方案一:检查并修改 .dockerignore

打开项目根目录的 .dockerignore 文件,看看有没有 node_modules 这一行:

  • 如果有,直接删掉这一行,这样Docker构建时就会把 node_modules 包含进去;
  • 要是你不想全局移除,也可以在构建镜像的step前临时重命名 .dockerignore,构建完再恢复(不过这种方式比较麻烦,不推荐)。

方案二:优化Dockerfile(更推荐)

其实不建议直接把本地生成的 node_modules 复制到镜像里——毕竟GitHub Actions的runner环境和你用的 node:14-alpine 镜像环境可能存在依赖兼容性问题(比如系统库版本差异)。更靠谱的做法是在Docker镜像内部安装依赖:

修改你的 github.Dockerfile 成这样:

FROM node:14-alpine as app
WORKDIR /usr/home/app
COPY package.json ./
RUN npm install  # 在镜像内部安装依赖,而非复制本地的node_modules
COPY src ./
# 如果你的build步骤需要在镜像内执行,还可以加上:RUN npm run build

这么做的好处:

  • 依赖是在alpine环境下安装的,兼容性拉满;
  • 完全不用管 .dockerignore 或者本地依赖的问题;
  • 镜像的可移植性更强,换个环境跑也不容易出问题。

方案三:确认工作目录一致性(排查用)

如果上面的方法都没解决,你可以在 docker build 步骤前加个命令,确认当前目录和 node_modules 的位置:

- name: Verify working directory and files
  run: pwd && ls -al

这样能确保 node_modules 确实在Docker构建的上下文目录(也就是你指定的 .)下面。

内容的提问来源于stack exchange,提问作者Harold L. Brown

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.09 09:38:15