为什么我NAS里面对应的EasyNVR镜像提示异常?我原本通过二进制部署的,现在想通过Docker进行部署能迁移吗?
最近好多用户在问相关的问题,而且有好多NAS用户不了解Docker的本质原理,这篇文章就从EasyNVR的业务需求和技术实现详细讲讲EasyNVR的升级逻辑
问题引入:EasyNVR怎么升级
Web页面升级
上传easynvr.com进行升级,安装包在EasyNVR官网下载页面可以获取,easynvr.com包含在安装包中,需要区分Windows与Linux系统,AMD64(X64)与ARM64架构。如果是Docker安装的用户下载Linux系统对应的架构进行升级
使用Web升级的优点是,升级过程由EasyNVR控制,如果购买了授权,授权文件会自动更新

Docker升级
- Docker-Cli安装使用
docker pull <镜像地址>拉取镜像后重启;
bash
# AMD64架构拉取指令
docker pull registry.cn-shanghai.aliyuncs.com/rustc/easynvr_amd64:latest
# ARM64架构拉取指令
docker pull registry.cn-shanghai.aliyuncs.com/rustc/easynvr_arm64:latest
-
Docker-Compose安装的用户使用
docker compose up -d重新启动即可,docker会自动拉取镜像; -
NAS的DockerUI安装,上传或更新镜像后重新构建,如果应用商城下载的只需点击更新(不同NAS系统可能会存在细微差异);
使用Docker升级的缺点是,升级过程由脚本控制,如果购买了授权会提示授权异常,需要重新上传激活文件 或在后台更新授权。
分析需求
对比传统docker容器升级方式的设计,只映射数据文件,每次镜像更新后更新相关程序,如果下图所示,只是无须额外编写脚本

为什么在EasyNVR中不行呢?为了使升级更方便,我们保留了Web页面升级的方式。如果通过web页面进行升级后本地版本>镜像版本,当用户重启或重新构建构建时因为同步了镜像版本,会出现本地版本=镜像版本,变相的相当于,重启 = 降级
EasyNVR在上架绿联应用商城的时候,我们跟绿联协商了一套在NAS中的实现方案,使用脚本控制
脚本分析
首先会检测easynvr是否安装,首次安装情况下会将镜像中EasyNVR所有数据更新到容器中
bash
if [ ! -f "/app/easynvr.com" ];then
echo "首次安装正在初始化..."
cp /initial-files/easynvr /app
cp /initial-files/easynvr.com /app
cp /initial-files/private.pem /app
cp /initial-files/ntd /app
cp /initial-files/ffmpeg /app
cp /initial-files/easydog /app
echo "初始化完成"
else
...升级逻辑...
fi
当检测到已经安装EasyNVR后,执行升级逻辑。脚本会比较Docker镜像携带版本与本地版本的差异
bash
# 镜像版本
output1=$(/initial-files/easynvr.com -version 2>/dev/null)
version1=$(echo "$output1" | grep -oP '"version":"\K[^"]+')
# 已安装版本
output2=$(/app/easynvr.com -version 2>/dev/null)
version2=$(echo "$output2" | grep -oP '"version":"\K[^"]+')
通过比较符合升级条件,则将EasyNVR相关数据更新到容器中
bash
echo "已安装版本$version2,正在检查更新..."
# 用 sort -V 比较版本号
latest=$(printf "%s\n%s\n" "$version1" "$version2" | sort -V | tail -n1)
if [ "$latest" = "$version1" ] && [ "$version1" != "$version2" ]; then
echo "检测到镜像中包含新版本$version1,正在更新..."
cp /initial-files/easynvr /app
cp /initial-files/easynvr.com /app
cp /initial-files/private.pem /app
cp /initial-files/ntd /app
cp /initial-files/ffmpeg /app
cp /initial-files/easydog /app
echo "更新完成$version2=>$version1"
else
echo "未检测到镜像包含新版本,无需更新"
fi
还有一个小彩蛋,如果使用HTTPS的话需要生成证书,安装包中携带的话别人很容易能够解密,因此Docker部署的EasyNVR在首次启动时会自动自签HTTPS证书
bash
echo "正在检测HTTPS默认证书。。。"
# 判断 key.pem 是否存在
if [ ! -f "/app/configs/key.pem" ] || [ ! -f "/app/configs/cert.pem" ]; then
echo "证书文件不存在,正在生成..."
mkdir configs
# 自动生成证书,不交互
openssl req -x509 -newkey rsa:2048 -keyout /app/configs/key.pem -out /app/configs/cert.pem -days 365 -nodes \
-subj "/C=CN/ST=Province/L=City/O=Organization/OU=Department/CN=localhost"
echo "证书生成完成"
else
echo "证书文件已存在,无需生成"
fi
总结
使用Docker安装的优缺点
优点:
-
Web页面升级与Docker镜像升级两种方式同时支持
-
EasyNVR依赖升级无须手动更新
-
Docker部署==>二进制部署无感转换
缺点:
-
无法降级更新
-
官方推送镜像后NAS系统会提示镜像异常,Docker方式更新一次镜像(强迫症崩溃)