Docker化Github Actions报错:找不到node_modules状态文件
核心原因分析
本地构建镜像正常,但GitHub Actions环境中报错,大概率是容器内预先构建的文件被GitHub的工作区挂载覆盖,或者Yarn Berry的环境配置与运行时不匹配导致的。
解决方案
1. 避免工作区挂载覆盖镜像代码
GitHub Actions运行Docker Action时,默认会将调用仓库的工作区挂载到容器的/github/workspace目录。如果你的Action不需要访问调用仓库的文件,需明确指定容器内的工作目录为镜像中预先构建的路径:
修改action.yml,添加working-directory指定镜像内的工作路径:
runs: using: 'docker' image: 'Dockerfile' working-directory: '/usr/src/app' # 与Dockerfile中的WORKDIR保持一致
2. 检查Yarn Berry的nodeLinker配置
Yarn Berry的nodeLinker决定了依赖的管理方式,如果配置为pnp,则不会生成node_modules目录,可能导致代码找不到依赖状态文件:
在项目根目录的.yarnrc.yml中明确设置nodeLinker为node-modules:
nodeLinker: node-modules
重新构建Docker镜像,确保yarn install生成node_modules目录。
3. 强制在容器内指定路径执行命令
如果上述方法无效,可以修改Dockerfile的CMD,强制切换到镜像内的工作目录执行脚本,避免与挂载的工作区混淆:
CMD ["sh", "-c", "cd /usr/src/app && yarn start"]
4. 验证镜像内的文件完整性
在Dockerfile中添加验证命令,确保构建时正确生成了依赖文件:
# 在yarn install后添加 RUN ls -la /usr/src/app/.yarn RUN ls -la /usr/src/app/node_modules # 如果使用node-modules linker
构建镜像时查看这些命令的输出,确认.yarn缓存目录和node_modules存在。
5. 排查Dockerignore的影响
检查是否存在.dockerignore文件,若其中忽略了.yarn或node_modules相关文件,可能导致构建过程中某些必要文件缺失。确保.dockerignore没有排除以下内容:
# 不要忽略这些文件 !.yarn/cache !.yarn/patches !.yarn/plugins !.yarn/releases !.yarn/sdks !.yarn/versions
额外注意事项
如果你的Action需要输出内容给后续步骤,需在yarn start脚本中使用GitHub Actions的输出格式:
echo "some_output=你的输出内容" >> $GITHUB_OUTPUT
否则后续步骤无法获取到steps.my-id.outputs.some_output的值。
内容的提问来源于stack exchange,提问作者TheTanadu

