东方通TW8容器化部署过程记录手札

东方通TW8容器化部署过程记录手札

前言

近期进行东方通TW8容器化验证部署,记录过程吧。

基础环境

组件 版本 说明
基础镜像 debian-jdk11:20251013 基于Debian的JDK11环境
TongWeb TongWeb8.0.9.06 东方通Web应用服务器
构建工具 Docker Buildx 支持多平台构建

基于Debian的JDK11环境

Dockerfile
# 使用 Debian slim 作为基础镜像
#FROM debian:stable-slim
FROM debian:stable-20250908-slim

LABEL maintainer="guoliangjun<guoliangjun@199604.com>"

ARG JDK_TAR=jdk-11.0.24_linux-x64_bin.tar.gz
ARG JDK_DIR=jdk-11.0.24

# 环境变量(支持中文)
ENV TIME_ZONE="Asia/Shanghai" \
    LANG=zh_CN.UTF-8 \
    LANGUAGE=zh_CN:zh \
    LC_ALL=zh_CN.UTF-8

# 配置APT源、安装常用工具和中文字体、创建应用用户
RUN apt-get update \
    && apt-get install -y --no-install-recommends apt-transport-https ca-certificates \
    && sed -i 's@deb.debian.org@mirrors.tuna.tsinghua.edu.cn@g' /etc/apt/sources.list.d/debian.sources \
    && apt-get update \
    && apt-get install -y tzdata locales fontconfig fonts-dejavu-core fonts-dejavu-extra procps curl net-tools iputils-ping telnet unzip \
    && sed -i 's/# zh_CN.UTF-8 UTF-8/zh_CN.UTF-8 UTF-8/' /etc/locale.gen \
    && locale-gen zh_CN.UTF-8 \
    && update-locale LANG=zh_CN.UTF-8 \
    && ln -snf /usr/share/zoneinfo/$TIME_ZONE /etc/localtime \
    && echo $TIME_ZONE > /etc/timezone \
    && groupadd -g 2888 gzapps \
    && useradd -u 2888 -g gzapps -d /AppHome -s /bin/bash -M gzapps \
    && mkdir -p /AppHome \
    && chown gzapps:gzapps /AppHome \
    && apt-get clean \
    && rm -rf /var/lib/apt/lists/*

ADD ${JDK_TAR} /usr/local/jdk/

# 设置 JAVA_HOME 和 PATH
ENV JAVA_HOME=/usr/local/jdk/${JDK_DIR}
ENV PATH=$JAVA_HOME/bin:$PATH
构建镜像
# 构建amd
docker buildx build \
--build-arg JDK_TAR=jdk-8u421-linux-x64.tar.gz \
--build-arg JDK_DIR=jdk1.8.0_421 \
--load --no-cache --compress --platform linux/amd64 \
-t reg-hub.gzeport.com/cicd/jdk/debian-jdk8:20250903-amd64 .

# 构建arm
#----------------->
# 1. 安装 qemu 支持(启用跨架构构建)
docker run --rm --privileged tonistiigi/binfmt --install all

# 2. 删除所有旧 builder
docker buildx rm multi-builder || true
# docker buildx create --name multi-builder --use
docker buildx create --use --name=multi-builder \
--driver docker-container  \
--driver-opt network=host \
--driver-opt image=reg-hub.gzeport.com/jsb/moby/buildkit:buildx-stable-1 \
--config /etc/buildkit/buildkitd.toml
# 4. 启动并初始化
docker buildx inspect --bootstrap

# 5. 验证驱动是否正确
docker buildx ls
#----------------->
docker buildx build \
--build-arg JDK_TAR=jdk-8u421-linux-aarch64.tar.gz \
--build-arg JDK_DIR=jdk1.8.0_421 \
--load --no-cache --compress --platform linux/arm64 \
-t reg-hub.gzeport.com/cicd/jdk/debian-jdk8:20250903-arm64 .

#镜像合并
docker push reg-hub.gzeport.com/cicd/jdk/debian-jdk8:20250903-amd64
docker push reg-hub.gzeport.com/cicd/jdk/debian-jdk8:20250903-arm64
docker manifest create "reg-hub.gzeport.com/cicd/jdk/debian-jdk8:20250903" \
        --amend "reg-hub.gzeport.com/cicd/jdk/debian-jdk8:20250903-arm64" \
        --amend "reg-hub.gzeport.com/cicd/jdk/debian-jdk8:20250903-amd64"
docker manifest push --purge "reg-hub.gzeport.com/cicd/jdk/debian-jdk8:20250903"

# 查看合并镜像信息
docker manifest inspect reg-hub.gzeport.com/cicd/jdk/debian-jdk8:20250903




# 构建amd
docker buildx build \
--build-arg JDK_TAR=jdk-11.0.24_linux-x64_bin.tar.gz \
--build-arg JDK_DIR=jdk-11.0.24 \
--load --no-cache --compress --platform linux/amd64 \
-t reg-hub.gzeport.com/cicd/jdk/debian-jdk11:20251013-amd64 .

# 构建arm
#----------------->
# 1. 安装 qemu 支持(启用跨架构构建)
docker run --rm --privileged tonistiigi/binfmt --install all

# 2. 删除所有旧 builder
docker buildx rm multi-builder || true
docker buildx create --use --name=multi-builder \
--driver docker-container  \
--driver-opt network=host \
--driver-opt image=reg-hub.gzeport.com/jsb/moby/buildkit:buildx-stable-1 \
--config /etc/buildkit/buildkitd.toml
# 4. 启动并初始化
docker buildx inspect --bootstrap

# 5. 验证驱动是否正确
docker buildx ls
#----------------->
docker buildx build \
--build-arg JDK_TAR=jdk-11.0.24_linux-aarch64_bin.tar.gz \
--build-arg JDK_DIR=jdk-11.0.24 \
--load --no-cache --compress --platform linux/arm64 \
-t reg-hub.gzeport.com/cicd/jdk/debian-jdk11:20251013-arm64 .

#镜像合并
docker push reg-hub.gzeport.com/cicd/jdk/debian-jdk11:20251013-amd64
docker push reg-hub.gzeport.com/cicd/jdk/debian-jdk11:20251013-arm64
docker manifest create "reg-hub.gzeport.com/cicd/jdk/debian-jdk11:20251013" \
        --amend "reg-hub.gzeport.com/cicd/jdk/debian-jdk11:20251013-arm64" \
        --amend "reg-hub.gzeport.com/cicd/jdk/debian-jdk11:20251013-amd64"
docker manifest push --purge "reg-hub.gzeport.com/cicd/jdk/debian-jdk11:20251013"

# 查看合并镜像信息
docker manifest inspect reg-hub.gzeport.com/cicd/jdk/debian-jdk11:20251013

war部署过程-原tomcat替换到TW8

将TongWeb8.0.9.06构建成镜像

Dockerfile

# docker buildx build  --platform linux/amd64,linux/arm64 -t reg-hub.gzeport.com/cicd/tongweb/tongweb8-jdk11:20251013 --push --no-cache --compress .
FROM reg-hub.gzeport.com/cicd/jdk/debian-jdk11:20251013

# 定义TongWeb8版本信息
ENV CATALINA_HOME=/AppHome/TongWeb8
ENV PATH=${CATALINA_HOME}/bin:${PATH}

# 安装TongWeb8
ADD --chown=gzapps:gzapps TongWeb8.0.9.06.tar.gz /AppHome/

RUN set -eux && \
    cd /AppHome && \
    mv /AppHome/TongWeb8.0.9.06 $CATALINA_HOME && \
    chmod +x $CATALINA_HOME/bin/*.sh && \
    unzip $CATALINA_HOME/version8.0.9.06.zip -d $CATALINA_HOME/version8.0.9.06 && \
    rm -f $CATALINA_HOME/version8.0.9.06.zip && \
    chown -R gzapps:gzapps $CATALINA_HOME

ADD --chown=gzapps:gzapps console.xml $CATALINA_HOME/domains/domain1/conf/
ADD --chown=gzapps:gzapps tongweb.xml $CATALINA_HOME/domains/domain1/conf/
ADD --chown=gzapps:gzapps license.dat $CATALINA_HOME/

# 定义环境变量
ENV APP_PORT=8088 \
    ADMIN_PORT=9060

EXPOSE $APP_PORT $ADMIN_PORT

# 设置工作目录
USER gzapps
WORKDIR $CATALINA_HOME

tongweb.xml此文件自行修改内容,我这边从开始的改成启动时部署<server autoDeploy="false" autoDeployDir="autodeploy" startupDeploy="true" jpaEnabled="false" ExtremeMode="0">

具体配置情况销售提供的手册文档。

将项目war进行整合

Dockerfile

# docker build --no-cache -t gzeport-airedo-web-tongweb8:20251013 .
# docker buildx build --platform linux/amd64,linux/arm64 -t reg-hub.gzeport.com/jsb/airedo-dm/gzeport-airedo-dm:20251013test --push --no-cache --compress .
FROM reg-hub.gzeport.com/cicd/tongweb/tongweb8-jdk11:20251013

# env for application
ENV JAVA_OPTS="-Xms512m -Xmx512m -Djava.security.egd=file:/dev/./urandom "

COPY --chown=gzapps:gzapps gzeport-airedo-web.war $CATALINA_HOME/domains/domain1/autodeploy/gzeport-airedo-web.war

WORKDIR $CATALINA_HOME/bin

ENTRYPOINT ["/bin/sh", "-c", "startserver.sh domain1 $JAVA_OPTS"]

容器测试

docker run --rm -it -p 8088:8088 -p 9060:9060 reg-hub.gzeport.com/jsb/airedo-dm/gzeport-airedo-dm:20251013test
可以访问控制台与访问服务验证

访问:ip:9060 查看控制台是有项目存在了,访问ip:8088/项目访问前缀 即可验证,否则显示404

img

jar包部署过程-原tomcat替换到TW8

因技术测试环境全使用tomcat环境部署,如果直接pom替换tomcat改成tw8显得麻烦,因此决定是采用先maven构建jar包后,采用东方通提供的转换工具进行替换原来tomcat。过程参考销售提供的文档:TongWeb_V8.0嵌入式版_转换工具指南

转换工具可以将使用 Tomcat 作为嵌入式服务器的 Spring Boot 工程自动转换为使用 TongWeb 作为嵌入式 服务器的 Spring Boot 工程。

需准备以下环境

image-20251016101619651

如没使用netty可忽略tongweb-spring-boot-reactor 8.0.E.3_P1.zip

操作步骤

1.将 TongWeb 嵌入式运行需要的 “license.dat” 文件放置于与待转换 Spring Boot 项目工程的同级目录。 例如“/demo/license.dat”

2.解压 TongWeb 嵌入式产品包,tongweb-embed-8.0.E.3_P1.zip。 解压后的目录为“tongweb-embed-8.0.E.3_P1”。

3.解压 TongWeb 转换工具包,tongweb-transform-8.0.E.3_P1.zip 解压后的目录为“tongweb-transform-8.0.E.3_P1”。

4.运行 transform 脚本。 进入 TongWeb 转换工具包目录“tongweb-transform-8.0.E.3_P1”。执行如下命令,将待转换的 Spring Boot 项目工程转换为使用 TongWeb 作为嵌入式服务器的 Spring Boot 工程:./transform.sh {SRC_JAR_PATH} {TONGWEB_EMBED_LIB_PATH},demo:/transform.sh /home/demo/springboot-demo.jar home/tongweb-embed-{embed-release version}/lib/

提示,需要把tongweb-embed-8.0.E.3_P1/lib/*.pom删掉

转换jar包shell过程参考

#对jar包转换为东方通嵌入式
cp /home/gzeport/dockerBuild/tongweb-embed-8.0.E.3_P1/license.dat /home/gzeport/dockerBuild/jardemo/target/license.dat

cd /home/gzeport/dockerBuild/tongweb-transform-8.0.E.3_P1
./transform.sh /home/gzeport/dockerBuild/jardemo/target/jardemo.jar /home/gzeport/dockerBuild/tongweb-embed-8.0.E.3_P1/lib

#复制项目的Dockerfile文件到docker构建指定目录中
cp /home/gzeport/.jenkins/workspace/jardemo/Dockerfile /home/gzeport/dockerBuild/jardemo/Dockerfile
#进入构建根目录
cd /home/gzeport/dockerBuild/
#连接远程harbor仓库
docker login -u js-liux reg-hub.gzeport.com
#进行docker镜像的构建,指定项目的dockerfile文件
docker build -f jardemo/Dockerfile -t reg-hub.gzeport.com/jsb/jardemo:1.0.0 /home/gzeport/dockerBuild
# 上传到harbor仓库之中
docker push reg-hub.gzeport.com/jsb/jardemo:1.0.0

将tongweb-transform构建成镜像

Dockerfile

# docker buildx build  --platform linux/amd64,linux/arm64 -t reg-hub.gzeport.com/cicd/tongweb/tongweb8-transform-tools-jdk11:20251015 --push --no-cache --compress .
FROM reg-hub.gzeport.com/cicd/jdk/debian-jdk11:20251013

# 安装TongWeb8
ADD --chown=gzapps:gzapps tongweb-embed-8.0.E.3_P1.zip /AppHome/
ADD --chown=gzapps:gzapps tongweb-transform-8.0.E.3_P1.zip /AppHome/
ADD --chown=gzapps:gzapps license.dat /AppHome/

RUN set -eux && \
    cd /AppHome && \
    unzip /AppHome/tongweb-embed-8.0.E.3_P1.zip -d /AppHome/tongweb-embed-8.0.E.3_P1 && \
    unzip /AppHome/tongweb-transform-8.0.E.3_P1.zip -d /AppHome/tongweb-transform-8.0.E.3_P1 && \
    rm -f /AppHome/tongweb-embed-8.0.E.3_P1.zip && \
    rm -f /AppHome/tongweb-transform-8.0.E.3_P1.zip && \
    rm -f /AppHome/tongweb-embed-8.0.E.3_P1/lib/*.pom

WORKDIR /AppHome/tongweb-transform-8.0.E.3_P1

使用jenkins-pod模式(docker in docker)转换jar包

stage(' maven编译') {
            steps {
                container('maven') {
                    script{
                        //-T 1C 每核增加一个线程进行构建 -Dmaven.compile.fork 开启多线程编译 -U 强制更新依赖包   -Dmaven.test.skip 跳过测试项安装
                        sh "cd ${WORKSPACE}"
                        sh 'pwd && ls -l'
                        // sh "mvn clean package  -U -T 1C  -Dmaven.compile.fork=true -Dmaven.test.skip=true"
                        sh "mvn clean package -U -T 1C -Dmaven.compile.fork=true -Dmaven.test.skip=true -Dmaven.repo.local=/root/.m2/repository"
                    }
                }
            }
        }

        stage(' 转换配置文件') {
            steps {
                container('transform') {
                    script{
                        sh '''
                            pwd && ls -l \${WORKSPACE}/target/
                            mv \${WORKSPACE}/target/*.jar \${WORKSPACE}/target/app.jar
                            cp -f /AppHome/license.dat ${WORKSPACE}/target/
                            pwd && ls -l \${WORKSPACE}/target/
                            cd /AppHome/tongweb-transform-8.0.E.3_P1
                            bash ./transform.sh \${WORKSPACE}/target/app.jar /AppHome/tongweb-embed-8.0.E.3_P1/lib/
                        '''
                    }
                }
            }
        }

        stage(' 构建并推送Docker镜像') {
            steps {
                container('buildkit') {
                    withCredentials([usernamePassword(credentialsId: "${HARBOR_AUTH}", passwordVariable: 'harbor_passwd', usernameVariable: 'harbor_user')]) {
                        sh """
                            cd \${WORKSPACE}/target/
                            cp -f app-tw.jar app.jar
                            echo "Creating Dockerfile"
                            cat > Dockerfile <<-'EOF'
FROM reg-hub.gzeport.com/cicd/jdk/debian-jdk11:20250903
USER gzapps
COPY --chown=gzapps:gzapps app.jar /AppHome/app.jar
# env for application
ENV PORT=8080
ENV JAVA_OPTS=""
ENV AGENT_ARGS=""
WORKDIR /AppHome
EXPOSE \$PORT
# 转义 AGENT_ARGS 和 JAVA_OPTS 变量
ENTRYPOINT ["/bin/bash","-c","java \${AGENT_ARGS} \${JAVA_OPTS} -jar ./app.jar"]
EOF
                            # --- 配置 BuildKit 服务地址 ---
                            export BUILDKIT_HOST="buildkitd.devops.svc.cluster.local:1234"
                            echo "Connecting to BuildKit daemon at \${BUILDKIT_HOST}"

                            # --- 执行多平台构建与推送 ---
                            echo "Starting multi-platform build with buildctl..."
                            buildctl build \\
                              --frontend dockerfile.v0 \\
                              --local context=. \\
                              --local dockerfile=. \\
                              --opt "platform=linux/amd64,linux/arm64" \\
                              --opt "registry.user=\$harbor_user" \\
                              --opt "registry.password=\$harbor_passwd" \\
                              --output "type=image,name=${IMAGE_NAME},push=true" \\
                              --progress=plain

                            echo "✅ Build and push complete for ${IMAGE_NAME}"
                        """

                    }
                }
            }
        }

容器验证

启动容器后,查看日志存在tw显示内容,即是完成tomcat转换为tw

image-20251016102735511

过程存在问题

1.tw8的日志问题(暂时未解决)

2.暂时还没找到类似tomcat启动设置jvm参数(咨询厂家反馈是通过tongweb.xml文件进行配置)

image-20251016100847636

3.中文乱码问题,现象:日志中文显示为????????

暂时解决是使用JAVA_OPTS传参+基础镜像设置zh_CN.UTF-8

JAVA_OPTS="-Dfile.encoding=UTF-8 -Dsun.jnu.encoding=UTF-8"

4.离线安装应用部署包不兼容一个构建多镜像问题(amd64/arm64)

前一个版本因构建镜像过程需使用commandstool.sh工具命令进行离线安装应用部署,过程会存在异常问题:qemu: uncaught target signal 11 (Segmentation fault) - core dumped

#执行命令:离线安装应用部署包、解压日志采集安装包、配置东方通启动脚本、日志采集配置文件
RUN $CATALINA_HOME/bin/commandstool.sh --model=app \
    --action=add --username=gzeport --password=G111111 \
    --acceptAgreement=true --host=localhost --port=9060 \
    --appFrom=fromServer filename=/AppHome/gzeport-airedo-web.war  --offline \
    && unzip /AppHome/skywalking-agent.zip -d /AppHome/ \
    && rm -f /AppHome/skywalking-agent.zip \
    && rm -f /AppHome/gzeport-airedo-web.war \
    && echo '#!/bin/sh' > $CATALINA_HOME/bin/startserver.sh.new \
    && cat $CATALINA_HOME/bin/startserver.sh >> $CATALINA_HOME/bin/startserver.sh.new \
    && mv $CATALINA_HOME/bin/startserver.sh.new $CATALINA_HOME/bin/startserver.sh \
    && echo 'agent.service_name=airedo-web' > /AppHome/skywalking-agent/config/agent.config \
    && echo 'collector.backend_service=192.168.111.102:11800' >> /AppHome/skywalking-agent/config/agent.config \
    && chmod +x $CATALINA_HOME/bin/startserver.sh

image-20251016103323420

解决

改用启动时部署模式进行。(将原来v1版的在构建容器过程离线部署服务改成启动时部署

操作

在 tongweb.xml 中找到 server 节点(位于 tongweb > server 路径下)。

设置关键参数
  1. autoDeploy=”false”:关闭自动部署。
  2. autoDeployDir=”autodeploy”:自动部署目录。
  3. startupDeploy=”true”:启动时一次性部署。

image-20251016103901915

暂无评论

发送评论 编辑评论


				
|´・ω・)ノ
ヾ(≧∇≦*)ゝ
(☆ω☆)
(╯‵□′)╯︵┴─┴
 ̄﹃ ̄
(/ω\)
∠( ᐛ 」∠)_
(๑•̀ㅁ•́ฅ)
→_→
୧(๑•̀⌄•́๑)૭
٩(ˊᗜˋ*)و
(ノ°ο°)ノ
(´இ皿இ`)
⌇●﹏●⌇
(ฅ´ω`ฅ)
(╯°A°)╯︵○○○
φ( ̄∇ ̄o)
ヾ(´・ ・`。)ノ"
( ง ᵒ̌皿ᵒ̌)ง⁼³₌₃
(ó﹏ò。)
Σ(っ °Д °;)っ
( ,,´・ω・)ノ"(´っω・`。)
╮(╯▽╰)╭
o(*////▽////*)q
>﹏<
( ๑´•ω•) "(ㆆᴗㆆ)
😂
😀
😅
😊
🙂
🙃
😌
😍
😘
😜
😝
😏
😒
🙄
😳
😡
😔
😫
😱
😭
💩
👻
🙌
🖕
👍
👫
👬
👭
🌚
🌝
🙈
💊
😶
🙏
🍦
🍉
😣
Source: github.com/k4yt3x/flowerhd
颜文字
Emoji
小恐龙
花!
上一篇