记录一次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)" == "" ]]; thenecho "构建 Docker 镜像 $IMAGE_NAME ..."docker build -t $IMAGE_NAME .
fi# 检查容器是否已经在运行
RUNNING=$(docker inspect --format="{{.State.Running}}" $CONTAINER_NAME 2>/dev/null)if [ "$RUNNING" == "true" ]; thenecho "容器 $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
elseecho "容器 $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
elseecho "镜像 $IMAGE_NAME 不存在."
fi

最终测试

在这里插入图片描述

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

在这里插入图片描述

总结

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

在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/384809.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

学习笔记-系统框图传递函数公式推导

目录 *待了解 现代控制理论和自动控制理论区别 自动控制系统的组成 信号流图 1、系统框图 1.1、信号线、分支点、相加点 1.2、系统各环节间的连接 1.3、 相加点和分支点的等效移动(比较点、引出点) 2、反馈连接公式推导 2.1、前向通路传递函数…

android13 Settings动态显示隐藏某一项

总纲 android13 rom 开发总纲说明 目录 1.前言 2.确定目标设置项 3.修改参考 3.1 方法1 3.2 方法2 4.编译测试 5.彩蛋 1.前言 在Android 13系统中,动态显示或隐藏Settings应用中的某一项通常涉及到对Settings应用的内部逻辑进行修改。由于Settings应用是一个系统应用…

Vue3时间选择器datetimerange在数据库存开始时间和结束时间

♥️作者:小宋1021 🤵‍♂️个人主页:小宋1021主页 ♥️坚持分析平时学习到的项目以及学习到的软件开发知识,和大家一起努力呀!!! 🎈🎈加油! 加油&#xff01…

【linux】Shell脚本三剑客之sed命令的详细用法攻略

✨✨ 欢迎大家来到景天科技苑✨✨ 🎈🎈 养成好习惯,先赞后看哦~🎈🎈 🏆 作者简介:景天科技苑 🏆《头衔》:大厂架构师,华为云开发者社区专家博主,阿里云开发者社区专家博主,CSDN全栈领域优质创作者,掘金优秀博主,51CTO博客专家等。 🏆《博客》:Python全…

Docker+consul容器服务的更新与发现

1、Consul概述 (1)什么是服务注册与发现 服务注册与发现是微服务架构中不可或缺的重要组件。起初服务都是单节点的,不保障高可用性,也不考虑服务的压力承载,服务之间调用单纯的通过接口访问。直到后来出现了多个节点…

mac清理软件哪个好用免费 MacBook电脑清理软件推荐 怎么清理mac

随着使用时间的增长,mac电脑会积累一些不必要的垃圾文件,这些文件会占用宝贵的存储空间,影响电脑的运行速度和稳定性。因此,定期清理mac电脑的垃圾文件是非常有必要的。市场上有许多优秀的Mac清理软件,包括一些出色的国…

打造一篇完美的【数学建模竞赛论文】:从准备到撰写的全面指南

目录 一、赛前准备 1.1 报名与纪律要求 1.2 MD5码上传 1.3 竞赛准备 1.4 时间分配 二、论文格式规范 2.1 摘要 2.2 参考文献 2.3 排版要求 三、建模过程与方法 3.1 问题分析与模型假设 3.2 模型构建与求解 3.3 结果分析与检验 四、论文撰写技巧 4.1 论文结构 4…

mybatis中的缓存(一级缓存、二级缓存)

文章目录 前言一、MyBatis 缓存概述二、一级缓存1_初识一级缓存2_一级缓存命中原则1_StatementId相同2_查询参数相同3_分页参数相同4_sql 语句5_环境 3_一级缓存的生命周期1_缓存的产生2_缓存的销毁3_网传的一些谣言 4_一级缓存核心源码5_总结 三、二级缓存1_开启二级缓存2_二级…

Java面试八股之BeanFactory和ApplicationContext有什么区别

BeanFactory和ApplicationContext有什么区别 在Spring框架中,BeanFactory和ApplicationContext都是用于管理和控制Bean的容器,但是它们之间存在一些关键的区别。下面是这些区别的总结: 功能和特性: BeanFactory是最基础的容器,…

ecshop网站部署

目录 步骤1 ecshop网站的部署 一、安装环境 二、设置开机启动 ​三、 测试php ​四、上传安装包 五、安装ecshop 步骤1 ecshop网站的部署 一、安装环境 yum install -y httpd mariadb-server php php-devel php-mysql 浏览器访问:192.168.30.2 二、设置开机启…

docker 安装单机版redis

把这三个放上去 修改成自己的 按照自己需求来 照图片做 vim redis.conf vim startRedis.sh mv startRedis.sh deployRedis.sh sh deployRedis.sh docker run --privilegedtrue \ --name dev.redis --restartalways \ --network dev-net \ -v ./config/redis.conf:/etc/r…

Golang高效合并(拼接)多个gzip压缩文件

有时我们可能会遇到需要把多个 gzip 文件合并成单个 gzip 文件的场景,最简单最容易的方式是把每个gzip文件都先解压,然后合并成一个文件后再次进行压缩,最终得到我们想要的结果,但这种先解压后压缩的方式显然效率不高,…

QSqlRelationalTableModel 增删改查

QSqlRelationalTableModel 可以作为关系数据表的模型类,适用于三范式设计的表,主表中自动加载外键表中的名称。本文实现QSqlRelationalTableModel 为模型类,实现增删改查。 目录 0.表准备 1. 构建表格数据 声明变量 表格、数据模型、选择…

WPF多语言国际化,中英文切换

通过切换资源文件的形式实现中英文一键切换 在项目中新建Language文件夹,添加资源字典(xaml文件),中文英文各一个。 在资源字典中写上想中英文切换的字符串,需要注意,必须指定key值,并且中英文…

26 Python序列结构

Python 中常用的序列结构有列表、元组、字典、字符串、集合等。 从是否有序这个角度看,Python 序列可以分为有序序列和无序序列;从是否可变来看,Python 序列可以分为可变序列和不可变序列两大类。 生成器对象和 range、map、enumerate、filte…

【计算机毕设论文】基于SpringBoot教材管理系统

💗博主介绍:✌全平台粉丝5W,高级大厂开发程序员😃,博客之星、掘金/知乎/华为云/阿里云等平台优质作者。 【源码获取】关注并且私信我 感兴趣的可以先收藏起来,同学门有不懂的毕设选题,项目以及论文编写等相…

Harmony Next -- 通用标题栏:高度自定义,可设置沉浸式状态,正常状态下为:左侧返回、居中标题,左中右均可自定义视图。

hm_common_title_bar OpenHarmony三方库中心仓:https://ohpm.openharmony.cn/#/cn/detail/common_title_bar 介绍 一款通用标题栏,支持高度自定义,可设置沉浸式状态,正常状态下为:左侧返回、居中标题,左…

前端练习<HtmlCSS>——照片墙(附完整代码及实现效果)

这个小练习也来源于b站up小K师兄,大家可以通过下面的链接学习哦~up讲的非常详细。 纯CSS写一个简单酷炫的照片墙效果~ 先看一下这个照片墙的效果: 1.鼠标没有放到图片上时,照片同比例,每张照片都有倒影的效果。 2.然…

Spring 自定义集合实现策略

Spring 自定义集合实现策略 日常开发中,如果遇到复杂业务通常会用一个接口实现多个实现类。需要根据对应参数判断获取不同实现类。例如支付场景,根据选择支付方式,选择相应路由。如果实现类不多,通常会这样。如果实现类多了&…

华为网络模拟器eNSP安装部署教程

eNSP是图形化网络仿真平台,该平台通过对真实网络设备的仿真模拟,帮助广大ICT从业者和客户快速熟悉华为数通系列产品,了解并掌握相关产品的操作和配置、提升对企业ICT网络的规划、建设、运维能力,从而帮助企业构建更高效&#xff0…