GitLab CI构建Angular镜像时COPY package.json提示不存在
GitLab CI构建Docker镜像报错排查:
package.json no such file or directory 认知误区纠正
报错信息里提到的
/var/lib/docker/tmp/docker-builder*/路径根本不会出现在你本地设备上。它是GitLab Runner配套启动的docker:18-dind独立服务容器内部的临时构建目录:Docker执行构建时,会把指定的构建上下文整体打包上传到这个目录,后续所有COPY、ADD指令的源路径,全部相对于这个临时目录的根节点解析,和Dockerfile自身的存放位置没有任何关联——这也是你在本地/tmp目录找不到对应临时文件夹的直接原因。
根本原因定位
对照你提供的CI配置和Dockerfile内容,报错的核心是构建上下文和COPY指令的路径不匹配:
你当前的构建命令是在仓库根目录执行的,命令末尾的.参数代表把整个仓库根目录当成构建上下文传给Docker守护进程。但你的Dockerfile实际存放在angular/子目录下,而Dockerfile里写的COPY package.json /app/package.json,会被Docker解析为“从构建上下文的根目录下读取package.json文件”。但你前端项目的package.json实际是存放在angular/子目录里的,根本不在构建上下文的根路径下,因此Docker检索不到对应文件,直接触发拷贝失败的报错。
可行解决思路
- 最优方案:调整构建上下文指向
把CI脚本里的build命令末尾的.替换为angular/,也就是直接把前端项目所在的子目录作为构建上下文。此时Dockerfile内部所有写的相对路径(比如COPY package.json /app/package.json、COPY . /app、ADD nginx.conf /etc/nginx/)都会和实际文件位置完全匹配,不需要改动Dockerfile内部的逻辑。调整后的构建命令为:docker build --file=angular/Dockerfile --rm=true -t "$CI_REGISTRY_REPO/$CI_REGISTRY_IMAGE" angular/
注意调整后要确认:Dockerfile最后引用的nginx.conf文件必须实际存放在angular/目录下,否则会触发新的文件找不到的报错。 - 次优方案:修改Dockerfile内的源路径
如果不想调整构建上下文,就需要把Dockerfile里所有COPY、ADD指令的源路径,补充上相对于仓库根目录的前缀:- 把
COPY package.json /app/package.json改成COPY angular/package.json /app/package.json - 把
COPY package-lock.json /app/package-lock.json改成COPY angular/package-lock.json /app/package-lock.json - 把
COPY . /app改成COPY angular/ /app
这种方案的缺点是构建时会把整个仓库的所有文件都打包成构建上下文上传,传输耗时更长,还容易带入无关大文件导致构建缓存频繁失效,不推荐长期使用。
- 把
- 额外排查点
- 检查仓库根目录下的
.dockerignore文件,确认没有误写规则排除angular目录下的package.json、package-lock.json等构建必需文件 - 确认GitLab Runner拉取的master分支代码是完整的,没有因为仓库权限、子模块配置问题,导致angular目录下的文件没有同步到Runner的工作目录
- 检查仓库根目录下的
内容的提问来源于stack exchange,提问作者user14798877
相关产品推荐
相关产品推荐

