我的一个nextjs项目使用node:alpine基础镜像,dockerfile如下:
FROM node:alpine
WORKDIR /app
COPY package*.json ./
RUN npm i
COPY . .
ENV NEXT_PUBLIC_ENVIRONMENT=production
RUN npm run build
EXPOSE 3000
RUN echo "npm start" > start_up.sh
RUN chmod +x start_up.sh
CMD ["sh", "start_up.sh"]
在此之前部署到线上都能正常构建和运行,今天修改点代码提交到生产环境,发现竟然镜像构建失败了。
提示如下:
#9 [4/8] RUN npm i
#9 4.434 npm error Exit handler never called!
#9 4.434 npm error This is an error with npm itself. Please report this error at:
#9 4.435 npm error <https://github.com/npm/cli/issues>;
#9 4.435 npm error A complete log of this run can be found in: /root/.npm/_logs/2024-07-19T02_32_24_794Z-debug-0.log
起初我还以为是有什么依赖突然下载不了了,但是本地不使用dockerfile,直接npm run server
是成功的。并且删除本地node_modules目录后,重新npm i
之后构建运行也是成功的。
所以我怀疑是基础镜像的问题。查看官方镜像仓库是否有更新:
可以看到:“last pushed 8 hours ago by ….”,说明确实是基础镜像有更新,而node:alpine指的是latest版本。
我使用node –version和npm –version查看版本,确认自己版本是22.2.0,于是我找到相同node版本的镜像node:22.2.0-alpine
。
接着修改dockerfile:
FROM node:22.2.0-alpine
WORKDIR /app
COPY package*.json ./
RUN npm i
COPY . .
ENV NEXT_PUBLIC_ENVIRONMENT=production
RUN npm run build
EXPOSE 3000
RUN echo "npm start" > start_up.sh
RUN chmod +x start_up.sh
CMD ["sh", "start_up.sh"]
然后构建就成功了。
这个事情教育了我,选择镜像一定要指定版本,不要使用latest版本。因为镜像更新如果携带一些依赖软件的版本更新,就可能会导致我们代码无法构建或者无法正常运行。