solo 升级以及自动化更新的方法

本贴最后更新于 1646 天前,其中的信息可能已经时过境迁

使用 solo 过程总涉及到更新问题,所以就在这里把 solo 更新的方法总结一下。希望能给小伙伴们一些帮助。如何选择更新方法主要是跟你的部署方式有关,如果你是通过 docker 方式进行部署,那么你可以还可以通过 docker 方式来进行更新,这也是官方比较推荐的部署方式。如果是通过 jar 包或者 war 包来进行部署,那么更新时同样需要通过该方式来进行。好了闲话少叙进入正题。

使用 docker 更新

第一步: 获取最新镜像:

docker pull b3log/solo:latest

执行结果如下:

如果有新版本,该命令会自动拉取新镜像,也就是会上边下载的界面。自动更新镜像。
如果当前版本已是最新则会出现下边情况,此时也就不用更新。

第二步: 删除原来的容器
第一步虽然获取了最新的镜像,但是我们当前部署的容器却是旧的,需要我们删除之后重新进行部署。
执行 docker ps 查看当前容器的运行情况

此处我部署的 solo 的容器名称是 www_solo,所以你在下边删除容器时要更改成自己的 solo 容器名称

docker stop www_solo
docker rm www_solo

执行结果如下:

第三步: 重新部署 solo 容器

docker run --detach --name solo --network=host \
    --env RUNTIME_DB="MYSQL" \
    --env JDBC_USERNAME="root" \
    --env JDBC_PASSWORD="123456" \
    --env JDBC_DRIVER="com.mysql.cj.jdbc.Driver" \
    --env JDBC_URL="jdbc:mysql://127.0.0.1:3306/solo?useUnicode=yes&characterEncoding=UTF-8&useSSL=false&serverTimezone=UTC" \
    b3log/solo --listen_port=8080 --server_scheme=http --server_host=localhost
  • --env JDBC_PASSWORD="123456" : 需要将 123456 更改成自己的 mysql 密码
  • --server_host=localhost: 需要将 localhost 更改成自己的域名

执行结果如下:

至此 solo 更新完成

通过 jar 包或者 war 包更新

此种方式一般都是通过源码来进行部署的,需要重新导入新的 solo 源码,配置相关信息,然后重新导出。具体的方法可以参考官方给的文档,此处不再详说。

通过脚本定期更新

首先,官方给了一个脚本用于更新或者重启,内容如下:

#!/bin/bash

#
# Solo docker 更新重启脚本
#
# 1. 请注意修改参数
# 2. 可将该脚本加入 crontab,每日凌晨运行来实现自动更新
#

docker pull b3log/solo
docker stop solo
docker rm solo
docker run --detach --name solo --network=host \
    --env RUNTIME_DB="MYSQL" \
    --env JDBC_USERNAME="root" \
    --env JDBC_PASSWORD="123456" \
    --env JDBC_DRIVER="com.mysql.cj.jdbc.Driver" \
    --env JDBC_URL="jdbc:mysql://127.0.0.1:3306/solo?useUnicode=yes&characterEncoding=UTF-8&useSSL=false&serverTimezone=UTC" \
    b3log/solo --listen_port=8080 --server_scheme=http --server_host=localhost

上述脚本说实话用于重启容器可以,但是用于定期更新脚本稍微有点不足,因为定期更新的脚本正常应该检查当前部署的版本是否是最新版本,如果不是才更新。而上边的脚本每次执行都会重新部署,显得开销优点大。下边我们对该脚本进行优化,使其更加合理。
因为 docker 没有命令直接来获取当前下载的镜像是否是最新版本,但是当我们通过 pull 一个镜像时我们会发现:如果当前本地镜像是最新镜像那么 docker 就不会从云端下载镜像,运行之后会出现如下结果:

如果当前镜像不是新的会出现如下运行结果:

因此我们可以借助 grep,来实现一个更新脚本 ``

#!/bin/bash
#
# Solo docker 更新脚本
#
# 1. 请注意修改参数
# 2. 可将该脚本加入 crontab,每日凌晨运行来实现自动更新
#

isUpdate=$(docker pull b3log/solo|grep "Downloaded")

#如果有新版本或者没有安装才会进行更新
if [[ -z  $isUpdate ]] 
then 
	echo This is the latest version
else
	docker stop solo
	docker rm solo
	docker run --detach --name solo --network=host \
	--env RUNTIME_DB="MYSQL" \
       	--env JDBC_USERNAME="root" \
	--env JDBC_PASSWORD="123456" \
	--env JDBC_DRIVER="com.mysql.cj.jdbc.Driver" \
	--env JDBC_URL="jdbc:mysql://127.0.0.1:3306/solo?useUnicode=yes&characterEncoding=UTF-8&useSSL=false&serverTimezone=UTC" \
       	b3log/solo --listen_port=8080 --server_scheme=http --server_host=localhost
fi

使用方法:

sudo ./docker-update.sh

如果是最新版会出现如下运行结果:

如果不是最新版会执行容器删除重启等命令,出现如下运行结果:

关于这一点我也想官方发起了 Pull request 希望组织能接受吧。

当然如果希望一劳永逸的解决该问题,我们可以通过 crontab 实现定时更新
首先docker-update.sh 文件放到 root 目录(当然其他目录)也可以下:
其次执行 crontab -e 进入编辑界面添加如下内容(每天早上 1 点整执行更新任务):

0 1 * * * bash /root/docker-update.sh

通过 crontab -l 查看例行任务是否添加成功。
整个过程的执行结果如下图所示:

后记

当然可能个人水平有限,中间难免会出现一些错误,如若发现恳请指出,不胜赐教。如果大家有更好的更新方法或者上边有任何疑问都欢迎大家在留言区提出,谢谢!

相关帖子

欢迎来到这里!

我们正在构建一个小众社区,大家在这里相互信任,以平等 • 自由 • 奔放的价值观进行分享交流。最终,希望大家能够找到与自己志同道合的伙伴,共同成长。

注册 关于
请输入回帖内容 ...
  • 容器死亡脚本失效,你可以 docker stop solo 后运行脚本,将不会 pull 镜像安装。这一点,我已优化,参考这里

  • vcjmhg
    作者

    谢谢,您写的更加全面