Docker容器Shell脚本执行npm run start时提示npm未找到的解决问询
解决Docker容器中npm命令找不到的问题
问题核心原因:
你的Dockerfile采用了多阶段构建,最终运行容器的镜像基于nginx:alpine——这个镜像默认没有安装Node.js和npm。前一个node:16.14.2阶段的Node环境、依赖包等内容,没有被复制到最终的nginx镜像中,所以执行script.sh里的npm run start时会提示"npm: not found"。
下面提供两种可行的解决方案:
方案一:多阶段构建,复制Node环境到nginx镜像
修改Dockerfile,在nginx阶段添加复制Node环境和项目文件的步骤,确保最终镜像同时包含nginx和Node.js:
# Build environment(构建阶段,生成依赖和项目文件) FROM node:16.14.2 AS builder WORKDIR /usr/src/app COPY package*.json ./ RUN npm install --only=production COPY . ./ # Server environment(最终运行镜像) FROM nginx:alpine # 从构建阶段复制Node.js核心文件和项目内容 COPY --from=builder /usr/local/lib/node_modules /usr/local/lib/node_modules COPY --from=builder /usr/local/bin/npm /usr/local/bin/npm COPY --from=builder /usr/local/bin/node /usr/local/bin/node COPY --from=builder /usr/src/app /usr/src/app COPY nginx.conf /etc/nginx/conf.d/configfile.template ENV HOST 0.0.0.0 ENV NODE_ENV production EXPOSE 8080 # 设置项目工作目录 WORKDIR /usr/src/app COPY script.sh / RUN chmod +x /script.sh ENTRYPOINT ["/script.sh"]
方案二:以Node镜像为基础安装nginx(更简洁)
放弃多阶段构建的nginx基础镜像,直接用Node镜像作为基础,在其中安装nginx,这样镜像天然包含Node环境:
FROM node:16.14.2-alpine WORKDIR /usr/src/app # 安装nginx及必要依赖 RUN apk add --no-cache nginx && mkdir -p /run/nginx # 安装项目依赖 COPY package*.json ./ RUN npm install --only=production COPY . ./ # 配置nginx COPY nginx.conf /etc/nginx/conf.d/configfile.template ENV HOST 0.0.0.0 ENV NODE_ENV production EXPOSE 8080 # 添加并执行脚本 COPY script.sh / RUN chmod +x /script.sh ENTRYPOINT ["/script.sh"]
内容的提问来源于stack exchange,提问作者ololo
相关产品推荐
相关产品推荐

