旧版Docker镜像升级说明 分享链接

作者:zhouyq 最后编辑:禅道-Bee 于 2024-04-01 09:39:46 浏览量:10340

一、为什么要升级?

  • 优化更新流程,不需要下载安装包,直接拉取新版镜像即可
  • 新版可以通过环境变量选择是否启用内置MySQL,方便对接外部MySQL
  • 新版原生支持Kubernetes部署
  • 旧版镜像2023年8月底停止更新

二、新旧版本对比

对比项 旧版 新版 说明
镜像大小 342Mb 204Mb 压缩后镜像大小
针对容器优化 新版优化了持久化目录、配置与安装流程
渠成应用市场 通过渠成应用市场安装
集成MySQL 新版可通过环境变量控制是否使用内置MySQL
对接外部MySQL 是,手动修改my.php 是,通过环境变量  
持久化目录 禅道代码+MySQL数据 禅道配置+用户数据 或 MySQL数据 新版镜像只需要挂载容器内 /data 目录
禅道升级 下载源码包覆盖程序 拉取新版本镜像  
Dockerfile开源 新版Dockerfile源码
docker-compose编排  
Kubernetes运行  
高可用部署  
PHP配置修改 手动 环境变量 新版通过环境变量设置PHP参数
Session存储 文件 文件 或 Redis 新版通过环境变量设置
PHP配置修改 手动 环境变量 新版通过环境变量设置PHP参数
配置SMTP 手动 环境变量  
配置LDAP 手动 环境变量 企业版、旗舰版支持
配置CI 手动 环境变量  
配置Git服务 手动 环境变量  

三、旧版升级流程

旧版升级流程.svg

3.1 备份数据

  • 命令行进入到旧版容器内执行
# 查找禅道容器ID,默认容器名为 zentao,请根据实际情况填写禅道容器名
cid=$(docker ps -q --filter name=zentao)
# 查看旧版禅道服务的持久化目录位置
docker inspect $cid | grep -B 1 "/www/zentaopms"                                                                                    
                "/tmp/zentao-db:/var/lib/mysql",
                "/tmp/zentao-files:/www/zentaopms"
--
                "Source": "/tmp/zentao-files",
                "Destination": "/www/zentaopms",
# 本示例的宿主机目录分配是:
# MySQL目录:/tmp/zentao-db
# 禅道目录:/tmp/zentao-files
# 进入到禅道容器内
docker exec -it $cid bash
# 查看当前运行的禅道版本
cat /www/zentaopms/VERSION
max4.1    # 记住这个版本号,升级新版镜像时要用到
# 通过命令行备份禅道数据
# 切换到禅道工作目录的bin目录
cd /www/zentaopms/bin
# 根据当前配置生成备份脚本
bash init.sh
Please input your php path:(example: /usr/bin/php)
/usr/bin/php
Please input zentao url:(example: http://localhost:88/zentao or http://localhost)
http://localhost
ztcli.sh ok
backup.sh ok
computeburn.sh ok
computetaskeffort.sh ok
dailyreminder.sh ok
checkdb.sh ok
syncsvn.sh ok
syncgit.sh ok
sendmail.sh ok
sendwebhook.sh ok
createcycle.sh ok
initqueue.sh ok
checkbuildstatus.sh ok
execcompile.sh ok
deletelog.sh ok
encrypt.sh ok
cron.sh ok
# 通过backup.sh脚本备份禅道
bash backup.sh
备份成功!
# 备份文件存在 /www/zentaopms/tmp/backup 目录,本示例文件如下:
ls -1 /www/zentaopms/tmp/backup
202303150937474.code       # 代码备份
202303150937474.file       # /www/zentaopms/www/data 目录备份
202303150937474.sql.php    # 数据库备份
summary                    # 本次备份统计信息 

3.2 启动新版禅道镜像

3.2.1 创建新版禅道数据目录

本示例使用 /data/zentao 作为新版禅道得持久化目录,要保证 /data 分区或 / 分区有足够的剩余空间。

mkdir /data/zentao 

3.2.2 下载镜像,启动服务

禅道镜像内包含MySQL服务,默认不启动,如果启动内置的MySQL服务,需要设置环境变量 MYSQL_INTERNAL=true

拉取镜像

docker pull hub.zentao.net/app/zentao:max4.5 

启动禅道

docker run -d \
--name new-zentao \
-v /data/zentao:/data \
-p 8080:80 \
-p 13306:3306 \
-e MYSQL_INTERNAL=true \
hub.zentao.net/app/zentao:max4.5 

注意: 


  • 启动命令设置了 MYSQL_INTERNAL=true 环境变量,会在容器内启动MySQL服务 
  • 请根据实际情况设置容器名称,本示例使用 new-zentao 是为了与旧版的 zentao 名称区分 
  • 请根据实际情况设置端口映射,本示例将容器内的80端口映射为8080,3306映射为13306


查看启动日志

docker logs -f zentao 

日志信息如下:

 14:18:19.19
 14:18:19.20 Welcome to the Easysoft ZenTao max4.5 container
 14:18:19.20 Subscribe to project updates by watching https://www.zentao.net
 14:18:19.20 Submit issues and feature requests at https://www.zentao.net/ask.html
 14:18:19.20
 14:18:19.21 INFO  ==> Prepare persistence directories.
 14:18:19.46 INFO  ==> Render php.ini with environment variables.
 14:18:19.46 INFO  ==> render template php.ini for amd64
 14:18:19.47 INFO  ==> Render apache sites config with envionment variables.
 14:18:19.49 INFO  ==> Copy mysql data to /data/mysql/data
 14:18:19.49 INFO  ==> Check whether the MySQL is available.
 14:18:19.50 WARN  ==> Waiting MySQL 1 seconds
 14:18:19.51 WARN  ==> Please open the browser to complete the installation through the wizard.
 14:18:19.52 INFO  ==> Render mysql config with envionment variables.
230804 14:18:19 mysqld_safe Logging to '/data/mysql/logs/mysql_error.log'.
230804 14:18:19 mysqld_safe Starting mariadbd daemon with databases from /data/mysql/data
 14:18:20.51 INFO  ==> MySQL is ready.
 14:18:20.51 WARN  ==> Please open the browser to complete the installation through the wizard. 

注意:

  • 容器启动时会根据环境变量对PHP、Apache、MySQL等服务进行配置,支持的环境变量
  • 容器启动时,会检查MySQL服务是否可以正常连接,默认情况下等待30秒,如果30秒内不能连接MySQL,容器会自动退出
  • 首次启动容器时,最后会打印输出 Waiting for the installation wizard to complete. 看到这个消息,请打开浏览器,完成禅道安装向导。

3.3 导入备份的数据

在导入备份的数据之前,先要了解新版镜像的持久化目录对应关系:

禅道代码目录 容器持久化目录 说明
/apps/zentao/www/data /data/zentao/www/data 禅道用户上传的文件目录
/apps/zentao/config/my.php /data/zentao/config/my.php 禅道主配置文件
/apps/zentao/config/ext /data/zentao/config/ext 存放禅道插件的目录
/apps/zentao/config/license /data/zentao/config/license 禅道授权目录
/apps/zentao/extension/custom /data/zentao/extension/custom 禅道自定义插件目录
/apps/zentao/module/extension/ext /data/zentao/module/extension/ext 禅道企业版/旗舰版插件目录
/apps/zentao/tmp/backup /data/zentao/tmp/backup 备份目录
/apps/zentao/tmp/log /data/zentao/tmp/log 日志目录
/apps/zentao/tmp/template /data/zentao/tmp/template 模板目录

注意:

  • 为了实现以上目录的持久化存储,新版禅道镜像对需要做持久化的目录做了软连接处理,首次启动时会在 /data 创建目录,并软连接到容器内的禅道代码目录,详情参加:源码:持久化目录处理
  • 将旧版的备份恢复到新版的操作要尽量选用低峰,否则会造成数据不一致。

3.3.1 恢复文件

恢复文件时建议关闭新旧版的禅道服务,上文得到的旧版禅道目录是 /tmp/zentao-files 因此,需要将该目录下需要持久化的目录复制到新版镜像持久化目录即可,不需要将所有文件复制到新版持久化目录。

# 关闭旧版禅道服务
docker stop zentao
# 关闭新版禅道服务
docker stop new-zentao
# 将旧版需要持久化的目录复制到新版目录
# 此步骤在宿主机执行
# www/data             -- 禅道用户上传的文件目录
cp -rp /tmp/zentao-files/www/data /data/zentao/www/
# config/my.php        -- 禅道主配置文件
cp -rp /tmp/zentao-files/config/my.php /data/zentao/config/my.php
# config/ext           -- 存放禅道插件的目录
cp -rp /tmp/zentao-files/config/ext /data/zentao/config/
# config/license       -- 禅道授权目录
cp -rp /tmp/zentao-files/config/license /data/zentao/config/
# extension/custom     -- 禅道自定义插件目录
cp -rp /tmp/zentao-files/extension/custom /data/zentao/extension/
# module/extension/ext -- 禅道企业版/旗舰版插件目录
[ -d /tmp/zentao-files/module/extension/ext ] && cp -rp /tmp/zentao-files/module/extension/ext /data/zentao/module/extension/ 

3.3.2 修改my.php配置

vi /data/zentao/config/my.php
<?php
$config->installed       = true;
$config->debug           = false;
$config->requestType     = 'PATH_INFO';
$config->timezone        = 'Asia/Shanghai';
$config->db->host        = '127.0.0.1';  # 使用内部的MySQL
$config->db->port        = '3306';
$config->db->name        = 'zentao';
$config->db->user        = 'root';
$config->db->encoding    = 'UTF8';
$config->db->password    = '123456';     # 默认密码
$config->db->prefix      = 'zt_';
$config->webRoot         = getWebRoot();
$config->default->lang   = 'zh-cn'; 

注意:

  • 如果你之前使用的就是内置MySQL,且没有修改过默认密码,my.php 可以不用修改。
  • 如果你修改了默认的数据库密码,请将MySQL的密码修改为更新后的密码。
  • 如果你使用的是外部的MySQL,my.php不需要修改。

3.3.3 恢复数据库

启动新版禅道镜像:

# 启动之前,先确认旧版禅道容器是否已经清理
docker rm zentao
# 启动新版禅道
docker run -d \
--name zentao \
-v /data/zentao:/data \
-p 8080:80 \
-p 13306:3306 \
-e MYSQL_INTERNAL=true \
hub.zentao.net/app/zentao:max4.5
# 查看服务状态
docker logs -f zentao 

3.1 备份的数据库导入到新启动的MySQL:

# 删除备份文件的第一行
sed -i '1d' 202303150937474.sql.php
# 将SQL中不符合时间规范的字段替换为 1970-01-01
sed -i 's/0000-00-00/1970-01-01/g' 202303150937474.sql.php
# 修改文件名
mv 202303150937474.sql.php 202303150937474.sql
# 导入数据,宿主机执行  

mysql -uroot -h127.0.0.1 -P13306 -p zentao < 202303150937474.sql

# 导入数据完成后,手动重启zentao容器

docker restart zentao

四、新版禅道镜像的版本升级

从旧版镜像切换到新版镜像,或者直接使用新版镜像后,升级禅道只需要拉取最新的禅道镜像即可。

切记:升级前通过命令行或者禅道后台备份数据

本示例介绍如何从 禅道 旗舰版 4.5 升级到 4.6

# 拉取禅道旗舰版 4.6 的镜像
docker pull hub.zentao.net/app/zentao:max4.6 

4.2 关闭旧版容器,启动新版镜像

# 关闭旧版容器
docker stop zentao
# 启动新版镜像
docker run -d \
--name zentao \
-v /data/zentao:/data \
-p 8080:80 \
-p 13306:3306 \
-e MYSQL_INTERNAL=true \
hub.zentao.net/app/zentao:max4.6 

五、其他

5.1 将Session存储到Redis

新版禅道镜像支持通过环境变量更改Session的存放类型,如下:

变量名 默认值 说明
PHP_SESSION_TYPE files php session 类型,files 或 redis
PHP_SESSION_PATH /data/php/session php session 存储路径

示例:

docker run -d \
--name zentao \
-v /data/zentao:/data \
-p 8080:80 \
-p 13306:3306 \
-e MYSQL_INTERNAL=true \
-e PHP_SESSION_TYPE=redis \
-e PHP_SESSION_PATH=tcp://192.168.1.88:6379 \
hub.zentao.net/app/zentao:max4.6 

5.2 其他功能扩展

新版禅道镜像会针对禅道的功能增加不同的环境变量,通过环境变量开启和变更相关的功能与配置,更多详情参见:支持的环境变量

5.3 其他链接

六、历史记录

V1.0

  • 首版

V2.0

  • 内置MySQL,默认情况下不启动,可以通过设置MYSQL_INTERNAL=true 启用内置MySQL。
  • 降低部署成本,运行方式与旧版保持一致,高级用户可选择docker-compose的方式运行。
  • 18.6 版本禅道镜像会同步更新国内镜像,以后会使用 hub.zentao.net 的域名,方便国内用户拉取镜像。
  • 镜像的运行时(Apache、PHP、MySQL)会按照官方的稳定版一起发布,可及时修复环境安全漏洞。
  • 支持amd64与arm64 架构,满足国产信创需求。