构建Angular Docker容器时出现COPY失败:文件不存在错误
问题详情
我的Dockerfile配置如下:
FROM node:13-alpine as build-nodejs WORKDIR /app COPY package*.json /app/ RUN npm install COPY ./ /app/ ARG build_command=build_prod RUN npm run ${build_command} -- --output-path=./dist/out # Final nginx container FROM nginx:1.13 RUN apt-get update && apt-get -y upgrade && apt-get -y install nginx-extras libnginx-mod-nchan RUN rm -f etc/nginx/sites-enabled/default \ && rm -f /etc/nginx/conf.d/default.conf \ && rm -f /usr/share/nginx/html/index.html WORKDIR /usr/share/nginx/html COPY --from=build-nodejs /app/dist/out /usr/share/nginx/html COPY default.conf /etc/nginx/sites-enabled/default EXPOSE 80 CMD ["nginx", "-g", "daemon off;"]
构建时遇到错误:
Step 12/15 : COPY --from=build-nodejs /app/dist/out /usr/share/nginx/html
COPY failed: stat app/dist/out: file does not exist
排查步骤
验证npm构建命令的输出路径
检查package.json中build_prod脚本的定义,确认它是否本身已指定输出目录。部分框架(如Angular)的构建命令会读取配置文件中的输出路径,额外传递--output-path参数可能导致路径冲突,实际生成的目录可能不是/app/dist/out。
可以临时修改Dockerfile,在RUN npm run ${build_command}...后添加RUN ls -la /app/dist,查看build阶段实际生成的目录结构。本地执行构建命令验证
在项目根目录直接执行npm run build_prod -- --output-path=./dist/out,确认本地是否能正常生成dist/out目录及文件。如果本地构建也失败,问题根源在npm脚本本身,而非Docker配置。检查多阶段构建的阶段名称
确认COPY --from=build-nodejs中的阶段名与前面FROM node:13-alpine as build-nodejs的定义完全一致(注意大小写、拼写),避免因名称不匹配导致无法找到对应阶段的文件。排查Alpine镜像兼容性
node:13-alpine使用musl libc,部分npm包可能存在兼容性问题,导致构建过程静默失败、未生成输出目录。可以临时替换为node:13(非Alpine)镜像重新构建,验证是否能生成目标文件。检查Docker构建上下文
确认执行docker build的目录为项目根目录,同时检查.dockerignore文件是否意外忽略了构建所需的源码文件(若源码被忽略,build阶段无法完成编译,自然不会生成输出目录)。
内容的提问来源于stack exchange,提问作者Myrzabek

