Docker容器中Node无法找到index.js的问题求助
问题分析与解决
你的问题出在第二阶段的文件复制逻辑和启动命令路径不匹配:
- 第二阶段执行
COPY --from=build /app/build /app时,是将构建阶段/app/build目录下的所有内容直接复制到当前阶段的/app目录中,并不会在/app下创建build子目录。 - 但你的启动命令
CMD ["node", "/app/build/index.js"]仍在寻找/app/build/index.js,实际上该文件的真实路径是/app/index.js。
修正方案(二选一)
方案1:保持启动命令路径,调整复制逻辑
将构建阶段的build目录整体复制到当前阶段的/app下,维持路径一致性:
FROM node:alpine AS build WORKDIR /app COPY package*.json ./ RUN npm install COPY . . RUN npm run build # second step: FROM node:alpine WORKDIR /app # 把build目录整体复制到/app下,生成/app/build路径 COPY --from=build /app/build ./build COPY --from=build /app/package*.json ./ RUN npm install --only=production EXPOSE 3001 CMD ["node", "/app/build/index.js"]
方案2:保持复制逻辑,调整启动命令
既然构建产物已经直接放到/app下,就直接指向根目录的index.js:
FROM node:alpine AS build WORKDIR /app COPY package*.json ./ RUN npm install COPY . . RUN npm run build # second step: FROM node:alpine WORKDIR /app COPY --from=build /app/build /app COPY --from=build /app/package*.json ./ RUN npm install --only=production EXPOSE 3001 # 直接启动/app下的index.js CMD ["node", "/app/index.js"]
额外优化建议
- 安装生产依赖后,可以清理npm缓存进一步缩小镜像体积:
RUN npm install --only=production && npm cache clean --force - 复制文件时使用相对路径(如
./build),比绝对路径更符合Dockerfile的书写习惯。
内容的提问来源于stack exchange,提问作者JDD
相关产品推荐
相关产品推荐

