记录一次centos部署node高版本踩坑记录

前情回顾

大概在上周四的时候,我使用nuxt3把我上上周做的nuxt2项目重构了一遍,重构的时候感觉爽到飞起,vite+vue3+ts的感觉确实不错,再加上nuxt3的setup模板语法,写的得心应手

在项目写完之后我打算重新部署来替换之前的nuxt2,之前的nuxt2我使用的是node14版本。部署方式是使用很传统的方式,pm2进程守护,在nuxt2项目里每次运行npm install,npm run build,然后把命令配置到pm2的配置文件里面执行

遇到问题

安装nvm

我在发现以前的前端没有安装nvm的时候,我就打算自己装一个,这样可以随意的切换node版本,安装nvm的时候真的是特别慢,而且还总是卡死,差不多花了半个小时才装好nvm,换了几次方式和模块

在我以为可以正常切换的时候,结果出现问题

在这里插入图片描述

这个问题我去百度搜索了一下,它说是因为node18版本需要的GLIBC的库版本较高,需要去升级centos7的核心库才行。

升级系统核心库

在我升级系统核心库的时候,我看到一篇博文,上面的问题和我基本一摸一样

在这里插入图片描述

结果我开开心心的去尝试,马上就出现问题

在这里插入图片描述

我在执行这个命令的时候又出现了yum的报错

在这里插入图片描述

yum源问题

这个问题我也是去搜索了下,我发现是centos官方镜像源好像不维护那些了,在官网上已经完全搜不到这个地址的源的地址,然后经过一番努力,我为了处理这个yum的报错,又是翻阅了一大堆资料和博客,还问了一些大佬

最终是处理好了,我禁用了yum的某个仓库,并且大部分的源都设置成了阿里云的源,然后我去测试安装

安装的途中非常的顺畅,按照第一个博客的执行,基本所有步骤都ok了,除了上面的这一个

在这里插入图片描述

我当时心里想着处理完这个问题就一切结束了

结果中途一直报错,我找了另一种方案

在这里插入图片描述

结果执行的时候一直报错,报错No package devtoolset-8-gcc available,然后我又针对这个问题去搜索

看到下面这个博客我有点崩溃了

在这里插入图片描述

回到原点

还是yum源的问题,所以根本不能这样升级核心库,然后我也搜了很多相关的资料,还是没有结果

在这里插入图片描述

当时给我整的有点崩溃了,甚至想重装操作系统,但是目前公司的所有站点都是在这个内网服务器上的,而且很多站点都是之前的前端或者后端留下来的,用的都是vue2以及其他一些比较老的项目,我当时也不知道怎么办,求助了一下大佬,这个问题折磨了我一天多了。

docker神器

大佬给我推荐的一个解决方案就是docker,我当时为了部署这个项目,没得选择,就选择了docker,然后各种资料搜索,快速的上手docker,之前也有一点点docker基础,了解docker大概是干啥的,以及docker简单拉镜像,简单的命令。后面直接搜了一个nuxt3+ docker的部署

解决问题

编写Dockerfile

# 使用 Node.js 官方镜像作为基础镜像
FROM node:18.20.3 as build-stage

# 设置npm镜像源
RUN npm config set registry https://registry.npmmirror.com

# 创建工作目录并设置工作目录
RUN mkdir -p /app
WORKDIR /app

# 复制项目文件和目录到容器中
COPY . /app

# 全局安装 pm2 和 pnpm
RUN npm install pm2 -g
RUN npm install pnpm -g

# 安装依赖项并构建应用程序
RUN pnpm install && \
    pnpm build

# 清理node_modules目录
RUN rm -rf ./node_modules

# 指定容器启动时执行的命令
CMD ["pm2-runtime", "ecosystem.config.cjs"]

编写pm2配置文件

module.exports = {
	apps: [
		{
			name: 'NuxtAppName',
			port: '8081',
			exec_mode: 'cluster',
			instances: 'max',
			script: './.output/server/index.mjs',
		},
	],
};

经过ai整理了一个启动脚本和一个停止启动脚本,都是ai帮忙写的shell脚本哈哈哈

# start.sh 启动脚本
#!/bin/bash

# 切换到项目源码目录
cd /quickly/website/com-erp-cts-1

# 定义镜像和容器名称
IMAGE_NAME="com-erp-cts-app"
CONTAINER_NAME="com-erp-cts-container"

# 检查镜像是否已经存在,如果不存在则构建镜像
if [[ "$(docker images -q $IMAGE_NAME 2> /dev/null)" == "" ]]; then
  echo "构建 Docker 镜像 $IMAGE_NAME ..."
  docker build -t $IMAGE_NAME .
fi

# 检查容器是否已经在运行
RUNNING=$(docker inspect --format="{{.State.Running}}" $CONTAINER_NAME 2>/dev/null)

if [ "$RUNNING" == "true" ]; then
  echo "容器 $CONTAINER_NAME 已经在运行."
else
  # 如果容器不存在或者停止了,启动容器
  echo "启动 Docker 容器 $CONTAINER_NAME ..."
  docker run -d --name $CONTAINER_NAME -p 8081:8081 $IMAGE_NAME
fi

# stop.sh 停止的shell脚本
# !/bin/bash

# 定义镜像和容器名称
IMAGE_NAME="com-erp-cts-app"
CONTAINER_NAME="com-erp-cts-container"

# 检查容器是否已经运行
RUNNING=$(docker inspect --format="{{.State.Running}}" $CONTAINER_NAME 2>/dev/null)

if [ "$RUNNING" == "true" ]; then
  # 如果容器正在运行,先停止容器
  echo "停止 Docker 容器 $CONTAINER_NAME ..."
  docker stop $CONTAINER_NAME
fi

# 检查并删除容器
EXIST=$(docker ps -a --filter "name=$CONTAINER_NAME" --format "{{.Names}}")

if [ ! -z "$EXIST" ]; then
  # 如果容器存在,删除容器
  echo "删除 Docker 容器 $CONTAINER_NAME ..."
  docker rm $CONTAINER_NAME
else
  echo "容器 $CONTAINER_NAME 不存在."
fi

# 检查并删除镜像
EXIST_IMAGE=$(docker images -q $IMAGE_NAME 2>/dev/null)

if [ ! -z "$EXIST_IMAGE" ]; then
  # 如果镜像存在,删除镜像
  echo "删除 Docker 镜像 $IMAGE_NAME ..."
  docker rmi $IMAGE_NAME
else
  echo "镜像 $IMAGE_NAME 不存在."
fi

最终测试

在这里插入图片描述

呜呜呜,最后终于是搞定了

在这里插入图片描述

总结

最后总结一下,有时候做事情真的不能这么死板,不要在一棵树上吊死,要有多种方案去选择,不要永远去死磕一种方案,反正都是不熟悉的领域,尝试过一定时间,搞不通应该果断放弃,不要总是强迫自己要一定要这种方案,俗话说的好,只要思想不滑坡,办法总比困难多哈哈哈,最后真的真的非常非常感激docker,docker真的神中神中神中神

在这里插入图片描述

  • 12
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值