背景
SpringBoot+node.js的组合是不是很另类?我的一个项目就是使用的这个框架🤦🏻♀️!因为页面中需要用到大量的前端开源项目,而这些比较新型的前端开源项目十有八九都需要依赖node+npm。所以不得已才在SpringBoot的项目中引入了这么个玩意儿!
发现问题
项目搞完以后在本地运行没问题,但是部署到Centos7.9系统的Docker上时,项目中需要依赖node的那些页面全部不能用,也没有明显的错误提示。后经过深入的排查发现是node版本的问题!我本地的IMAC电脑安装的是node的最新版本「v22.14.0」,但是线上环境通过以下代码执行后默认安装的是「v10.19.0」,为什么版本这么低呢?从网上查询的结果:由于我用的这个alpine基础镜像比较老,里面的nodejs是很早以前的,所以版本比较低。这个问题害我找了半天,因为他版本低但是并不影响项目的运行,只是调用的时候才会给反馈,真的挺无语的!
# 使用一个轻量的基础镜像 FROM openjdk:8-jdk-alpine # 安装 Node.js 和 npm RUN apk add --no-cache nodejs npm
解决问题
发现是版本的问题,本以为好解决,不就是升级下Docker的nodejs这么简单吗?万万没想到,全是坑!以至于差一点我就放弃升级版本了,选择退而求其次,将使用到的开源包主动降级去适配线上的低版本node.js。😌,也怪我学艺不精,对运维这块确实有很多盲区,导致我走了不少的弯路。其中最恶心的报错就是「Tracker "idealTree" already exists」,试了很多种方法其中绝大多方法到最后都是报这个错。当时从网上查的结果是因为缓存问题,我基本把所有跟请缓存的命令都用上了,甚至还加了「--force」但是毛用不管!我轮流问deepseek和ChatGPT始终无法解决「Docker升级node.js这个本以为很简单的问题」。最后我静下心来翻阅前面的查询结果才发现是我的写法错误导致的问题,跟缓存半毛线关系都没有!我的初始写法如下:
# 使用一个轻量的基础镜像 FROM openjdk:8-jdk-alpine # 安装 curl 和 bash RUN apk add --no-cache curl bash # 下载并安装基于 musl libc 的 Node.js 16 RUN curl -fsSL https://unofficial-builds.nodejs.org/download/release/v16.20.2/node-v16.20.2-linux-x64-musl.tar.gz -o node.tar.gz && \ tar -xzf node.tar.gz -C /usr/local --strip-components=1 && \ rm node.tar.gz # 替换为阿里云的镜像源 RUN sed -i 's/dl-cdn.alpinelinux.org/mirrors.aliyun.com/g' /etc/apk/repositories # 安装字体(如果有必要) RUN apk --no-cache add ttf-dejavu # 设置作者信息 LABEL maintainer="yk.li" # 将 jar 文件复制到镜像中 COPY springboot.jar app.jar # 复制 main.js 文件到根目录 COPY main.js /main.js # 生成 package.json RUN npm init -y # 安装依赖 RUN npm install html-minifier-terser clean-css prettier \ @prettier/plugin-php prettier-plugin-java prettier-plugin-nginx prettier-plugin-sql \ xml-formatter --save .....下方内容省略......
不知道大家有没有发现我的问题出在哪里?是的,我少了一步,将package.json相关的配置文件复制进去,并且多了RUN npm installl后面的这一坨内容。
正确的应该是下面这样:
# 使用一个轻量的基础镜像 FROM openjdk:8-jdk-alpine # 安装 curl 和 bash RUN apk add --no-cache curl bash # 下载并安装基于 musl libc 的 Node.js 16 RUN curl -fsSL https://unofficial-builds.nodejs.org/download/release/v16.20.2/node-v16.20.2-linux-x64-musl.tar.gz -o node.tar.gz && \ tar -xzf node.tar.gz -C /usr/local --strip-components=1 && \ rm node.tar.gz # 替换为阿里云的镜像源 RUN sed -i 's/dl-cdn.alpinelinux.org/mirrors.aliyun.com/g' /etc/apk/repositories # 安装字体(如果有必要) RUN apk --no-cache add ttf-dejavu # 设置作者信息 LABEL maintainer="yk.li" # 将 jar 文件复制到镜像中 COPY springboot.jar app.jar # 复制 main.js 文件到根目录 COPY main.js /main.js # 复制 package.json 以便提前安装依赖 COPY package.json package-lock.json* ./ RUN npm install .....下方内容省略......
重点看倒数第二三行,其实就这么简单!
总结
我的解决方案不见得适用所有人,但还是希望能给你提供一点解决问题的思路。最后,如果有想快速建设企业或者博客网站的,不妨关注下我们的diy自助建站平台,基于Java语言SpringBoot框架实现的建站系统,有更高的安全性、稳定性以及超高性能,而且价格优惠,百元建站,万元品质保障!如果有高端响应式(Bootstrap、TailwindCSS)建站网站模板或者各类建站素材的需求也可以关注我们的资源频道。