EasyNVR使用Docker部署升级的技术分享

为什么我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方式更新一次镜像(强迫症崩溃)

相关推荐
德育处主任Pro5 小时前
『NAS』Typora平替,一款所见即所得的MD编辑器-Haptic
docker·编辑器·群晖·nas·绿联
lcx_defender5 小时前
【Docker】Docker部署运行Nginx
nginx·docker·容器
lcx_defender5 小时前
【Docker】Docker部署运行Elasticsearch
elasticsearch·docker·jenkins
大胡子大叔5 小时前
docker pull命令拉取镜像失败的解决方案
运维·docker·容器
lcx_defender6 小时前
【Docker】Docker部署运行Seata
运维·docker·容器
lightningyang15 小时前
DVWA 在 openEuler 系统的安装部署
docker·渗透测试·openeuler·dvwa·天枢一体化虚拟仿真靶场平台
Ha_To18 小时前
2026.1.28 docker安装
运维·docker·容器
北极熊~~19 小时前
emqx持久化 Docker 容器中生成的数据并打包新镜像,迁移至新机器运行
运维·docker·容器
tomiatomia19 小时前
MinIO docker 部署使用的几个坑
运维·docker·容器