thingsboard/summary/18-ThingsBoard镜像打包详细分析.md

20 KiB
Raw Permalink Blame History

ThingsBoard 11个自身镜像打包详细分析

1. 概述

本文档详细分析 ThingsBoard 的 11 个自身镜像是如何从源码打包构建的。所有镜像的构建配置都在 msa/ 目录下,使用 Maven + Dockerfile 的方式构建。

2. 构建架构总览

2.1 构建流程

源码模块 → Maven 编译 → DEB/JAR 包 → Dockerfile 构建 → Docker 镜像

2.2 构建工具

  • Maven: 项目构建和依赖管理
  • dockerfile-maven-plugin: Docker 镜像构建插件Spotify
  • Docker: 容器构建工具

2.3 基础镜像

ThingsBoard 镜像使用两种基础镜像:

  1. Java 服务镜像: thingsboard/openjdk17:bookworm-slim

    • 用于tb-node、传输服务、vc-executor、edqs
  2. Node.js 服务镜像: thingsboard/node:22.18.0-bookworm-slim

    • 用于tb-web-ui、tb-js-executor

3. 11个镜像详细分析

3.1 镜像1: thingsboard/tb-node

用途: 核心服务和规则引擎服务(共用同一个镜像)

源码位置:

  • 应用源码: application/
  • Docker 构建: msa/tb-node/

构建流程:

  1. Maven 配置 (msa/tb-node/pom.xml):

    <!-- 依赖 application 模块的 DEB 包 -->
    <dependency>
        <groupId>org.thingsboard</groupId>
        <artifactId>application</artifactId>
        <classifier>deb</classifier>
        <type>deb</type>
    </dependency>
    
  2. 构建步骤:

    • maven-dependency-plugin: 复制 DEB 包到 target/ 目录
    • maven-resources-plugin: 复制 Dockerfile 和启动脚本到 target/ 目录
    • dockerfile-maven-plugin: 执行 Docker 构建
  3. Dockerfile (msa/tb-node/docker/Dockerfile):

    FROM thingsboard/openjdk17:bookworm-slim
    
    COPY logback.xml start-tb-node.sh ${pkg.name}.deb /tmp/
    
    RUN chmod a+x /tmp/*.sh \
        && mv /tmp/start-tb-node.sh /usr/bin && \
        (yes | dpkg -i /tmp/${pkg.name}.deb) && \
        rm /tmp/${pkg.name}.deb && \
        mv /tmp/logback.xml ${pkg.installFolder}/conf && \
        chown -R ${pkg.user}:${pkg.user} ${pkg.installFolder}/conf/logback.xml && \
        (systemctl --no-reload disable --now ${pkg.name}.service > /dev/null 2>&1 || :) && \
        chown -R ${pkg.user}:${pkg.user} /tmp && \
        chmod 555 ${pkg.installFolder}/bin/${pkg.name}.jar
    
    USER ${pkg.user}
    CMD ["start-tb-node.sh"]
    
  4. 关键文件:

    • DEB 包: thingsboard-{version}-boot.deb (来自 application/ 模块)
    • 启动脚本: start-tb-node.sh
    • 日志配置: logback.xml
  5. 服务区分:

    • 通过环境变量 TB_SERVICE_TYPE 区分:
      • TB_SERVICE_TYPE=tb-core → 核心服务
      • TB_SERVICE_TYPE=tb-rule-engine → 规则引擎服务

构建命令:

mvn clean install -DskipTests -Ddockerfile.skip=false --projects msa/tb-node --also-make

3.2 镜像2-6: 传输服务镜像5个

3.2.1 thingsboard/tb-mqtt-transport

源码位置:

  • 传输模块: transport/mqtt/
  • Docker 构建: msa/transport/mqtt/

构建流程:

  1. Maven 配置 (msa/transport/mqtt/pom.xml):

    <dependency>
        <groupId>org.thingsboard.transport</groupId>
        <artifactId>mqtt</artifactId>
        <classifier>deb</classifier>
        <type>deb</type>
    </dependency>
    
  2. Dockerfile (msa/transport/mqtt/docker/Dockerfile):

    FROM thingsboard/openjdk17:bookworm-slim
    
    COPY start-tb-mqtt-transport.sh ${pkg.name}.deb /tmp/
    
    RUN chmod a+x /tmp/*.sh \
        && mv /tmp/start-tb-mqtt-transport.sh /usr/bin && \
        (yes | dpkg -i /tmp/${pkg.name}.deb) && \
        rm /tmp/${pkg.name}.deb && \
        (systemctl --no-reload disable --now ${pkg.name}.service > /dev/null 2>&1 || :) && \
        chmod 555 ${pkg.installFolder}/bin/${pkg.name}.jar
    
    USER ${pkg.user}
    CMD ["start-tb-mqtt-transport.sh"]
    

3.2.2 thingsboard/tb-http-transport

构建位置: msa/transport/http/

Dockerfile: 与 MQTT 类似,使用 tb-http-transport.deb

3.2.3 thingsboard/tb-coap-transport

构建位置: msa/transport/coap/

Dockerfile: 与 MQTT 类似,使用 tb-coap-transport.deb

3.2.4 thingsboard/tb-lwm2m-transport

构建位置: msa/transport/lwm2m/

Dockerfile: 与 MQTT 类似,使用 tb-lwm2m-transport.deb

3.2.5 thingsboard/tb-snmp-transport

构建位置: msa/transport/snmp/

Dockerfile: 与 MQTT 类似,使用 tb-snmp-transport.deb

传输服务镜像共同特点:

  • 都使用 thingsboard/openjdk17:bookworm-slim 基础镜像
  • 都依赖对应的传输模块 DEB 包
  • 都使用相同的构建模式DEB 包 + 启动脚本)
  • 都使用 dockerfile-maven-plugin 构建

构建命令:

# 构建所有传输服务
mvn clean install -DskipTests -Ddockerfile.skip=false --projects msa/transport --also-make

# 构建单个传输服务
mvn clean install -DskipTests -Ddockerfile.skip=false --projects msa/transport/mqtt --also-make

3.3 镜像7: thingsboard/tb-web-ui

用途: Web UI 前端服务

源码位置:

  • 前端源码: ui-ngx/
  • Docker 构建: msa/web-ui/

构建流程:

  1. Maven 配置 (msa/web-ui/pom.xml):

    <!-- 依赖 ui-ngx 模块的 JAR 包(包含前端静态资源) -->
    <dependency>
        <groupId>org.thingsboard</groupId>
        <artifactId>ui-ngx</artifactId>
        <type>jar</type>
    </dependency>
    
  2. 构建步骤:

    • frontend-maven-plugin: 安装 Node.js 和 Yarn用于本地开发
    • maven-dependency-plugin: 解压 ui-ngx JAR 包,提取前端静态资源
    • maven-resources-plugin: 复制源代码和配置文件
    • dockerfile-maven-plugin: 执行 Docker 构建
  3. Dockerfile (msa/web-ui/docker/Dockerfile):

    FROM thingsboard/node:22.18.0-bookworm-slim
    
    ENV NODE_ENV production
    ENV DOCKER_MODE true
    
    COPY start-web-ui.sh /tmp/
    
    WORKDIR ${pkg.installFolder}
    
    COPY ["src/package.json", "src/yarn.lock", "./"]
    COPY package/linux/conf ./conf
    COPY package/linux/conf ./config
    COPY web ./web          # 前端静态资源(从 ui-ngx JAR 解压)
    COPY src/config ./config
    COPY src/server.js ./
    
    RUN chmod a+x /tmp/*.sh \
        && mv /tmp/start-web-ui.sh /usr/bin \
        && chown -R node:node ${pkg.installFolder} \
        && yarn install --production --non-interactive \
        && yarn cache clean --all
    
    USER node
    CMD ["start-web-ui.sh"]
    
  4. 关键特点:

    • 使用 Node.js 基础镜像(不是 Java
    • 直接复制源代码(不使用 DEB 包)
    • 前端静态资源来自 ui-ngx JAR 包
    • 在容器内安装 Node.js 依赖

构建命令:

mvn clean install -DskipTests -Ddockerfile.skip=false --projects msa/web-ui --also-make

3.4 镜像8: thingsboard/tb-js-executor

用途: JavaScript 执行器服务

源码位置:

  • 源码: msa/js-executor/src/
  • Docker 构建: msa/js-executor/

构建流程:

  1. Maven 配置 (msa/js-executor/pom.xml):

    • 使用 frontend-maven-plugin 管理 Node.js 和 Yarn
    • 使用 maven-resources-plugin 复制源代码
  2. Dockerfile (msa/js-executor/docker/Dockerfile):

    FROM thingsboard/node:22.18.0-bookworm-slim
    
    ENV NODE_ENV production
    ENV DOCKER_MODE true
    
    COPY start-js-executor.sh /tmp/
    
    WORKDIR ${pkg.installFolder}
    
    COPY ["src/package.json", "src/yarn.lock", "./"]
    COPY package/linux/conf ./conf
    COPY package/linux/conf ./config
    COPY src/api ./api
    COPY src/queue ./queue
    COPY src/config ./config
    COPY src/server.js ./
    
    RUN chmod a+x /tmp/*.sh \
        && mv /tmp/start-js-executor.sh /usr/bin \
        && chown -R node:node ${pkg.installFolder} \
        && yarn install --production --non-interactive \
        && yarn cache clean --all
    
    USER node
    CMD ["start-js-executor.sh"]
    
  3. 关键特点:

    • 使用 Node.js 基础镜像
    • 直接复制 TypeScript/JavaScript 源代码
    • 在容器内安装 npm 依赖
    • 不使用 DEB 包

构建命令:

mvn clean install -DskipTests -Ddockerfile.skip=false --projects msa/js-executor --also-make

3.5 镜像9: thingsboard/tb-vc-executor

用途: 版本控制执行器服务

源码位置:

  • Java 源码: msa/vc-executor/
  • Docker 构建: msa/vc-executor-docker/

构建流程:

  1. Maven 配置 (msa/vc-executor-docker/pom.xml):

    <dependency>
        <groupId>org.thingsboard.msa</groupId>
        <artifactId>vc-executor</artifactId>
        <classifier>deb</classifier>
        <type>deb</type>
    </dependency>
    
  2. Dockerfile (msa/vc-executor-docker/docker/Dockerfile):

    FROM thingsboard/openjdk17:bookworm-slim
    
    ENV DEBIAN_FRONTEND=noninteractive
    RUN apt-get update \
        && apt-get install -yq --no-install-recommends ncdu \
        && rm -rf /var/lib/apt/lists/*
    
    COPY start-tb-vc-executor.sh ${pkg.name}.deb /tmp/
    
    RUN mkdir -p /home/thingsboard/.config/jgit \
        && chown -R ${pkg.user}:${pkg.user} /home/thingsboard \
        && chmod a+x /tmp/*.sh \
        && mv /tmp/start-tb-vc-executor.sh /usr/bin && \
        (yes | dpkg -i /tmp/${pkg.name}.deb) && \
        rm /tmp/${pkg.name}.deb && \
        (systemctl --no-reload disable --now ${pkg.name}.service > /dev/null 2>&1 || :) && \
        chmod 555 ${pkg.installFolder}/bin/${pkg.name}.jar
    
    USER ${pkg.user}
    CMD ["start-tb-vc-executor.sh"]
    
  3. 关键特点:

    • 使用 Java 基础镜像
    • 使用 DEB 包安装
    • 额外安装 ncdu 工具
    • 创建 jgit 配置目录

构建命令:

mvn clean install -DskipTests -Ddockerfile.skip=false --projects msa/vc-executor-docker --also-make

3.6 镜像10: thingsboard/tb-edqs

用途: 事件驱动查询服务Event-Driven Query Service

源码位置:

  • Java 源码: edqs/
  • Docker 构建: msa/edqs/

构建流程:

  1. Maven 配置 (msa/edqs/pom.xml):

    <dependency>
        <groupId>org.thingsboard</groupId>
        <artifactId>edqs</artifactId>
        <classifier>deb</classifier>
        <type>deb</type>
    </dependency>
    
  2. Dockerfile (msa/edqs/docker/Dockerfile):

    FROM thingsboard/openjdk17:bookworm-slim
    
    COPY start-tb-edqs.sh ${pkg.name}.deb /tmp/
    
    RUN chmod a+x /tmp/*.sh \
        && mv /tmp/start-tb-edqs.sh /usr/bin && \
        (yes | dpkg -i /tmp/${pkg.name}.deb) && \
        rm /tmp/${pkg.name}.deb && \
        (systemctl --no-reload disable --now ${pkg.name}.service > /dev/null 2>&1 || :) && \
        chown -R ${pkg.user}:${pkg.user} /tmp && \
        chmod 555 ${pkg.installFolder}/bin/${pkg.name}.jar
    
    USER ${pkg.user}
    CMD ["start-tb-edqs.sh"]
    
  3. 关键特点:

    • 使用 Java 基础镜像
    • 使用 DEB 包安装
    • 与 tb-node 构建模式相同

构建命令:

mvn clean install -DskipTests -Ddockerfile.skip=false --projects msa/edqs --also-make

3.7 镜像11: thingsboard/haproxy-certbot

说明: 这个镜像不是 ThingsBoard 应用服务本身,而是 ThingsBoard 团队维护的 HAProxy 镜像。

源码位置: 不在当前仓库中(可能是独立的仓库)

用途: 负载均衡器 + SSL 证书管理(集成 Certbot

在 docker-compose.yml 中的使用:

haproxy:
  image: thingsboard/haproxy-certbot:2.2.33-alpine

注意: 这个镜像的构建配置不在当前源码仓库中。

4. 构建模式分类

4.1 模式1: DEB 包 + Java 基础镜像7个镜像

适用镜像:

  • tb-node (core + rule-engine)
  • tb-mqtt-transport
  • tb-http-transport
  • tb-coap-transport
  • tb-lwm2m-transport
  • tb-snmp-transport
  • tb-vc-executor
  • tb-edqs

构建流程:

Java 源码 → Maven 编译 → Gradle 打包 DEB → Dockerfile 安装 DEB → Docker 镜像

特点:

  • 标准化安装流程
  • 统一的文件结构
  • 自动权限管理

4.2 模式2: 源代码 + Node.js 基础镜像2个镜像

适用镜像:

  • tb-web-ui
  • tb-js-executor

构建流程:

TypeScript/JavaScript 源码 → 复制到镜像 → 安装依赖 → Docker 镜像

特点:

  • 直接复制源代码
  • 在容器内安装依赖
  • 不需要打包步骤

5. Maven 构建插件详解

5.1 dockerfile-maven-plugin

作用: 构建 Docker 镜像

配置 (msa/pom.xml):

<plugin>
    <groupId>com.spotify</groupId>
    <artifactId>dockerfile-maven-plugin</artifactId>
    <version>1.4.13</version>
</plugin>

执行阶段: pre-integration-test

功能:

  • build: 构建镜像
  • tag: 打标签
  • push: 推送镜像(需要 push-docker-image profile

5.2 maven-dependency-plugin

作用: 复制依赖的 DEB 包或 JAR 包到构建目录

示例 (msa/tb-node/pom.xml):

<execution>
    <id>copy-tb-deb</id>
    <phase>package</phase>
    <goals>
        <goal>copy</goal>
    </goals>
    <configuration>
        <artifactItems>
            <artifactItem>
                <groupId>org.thingsboard</groupId>
                <artifactId>application</artifactId>
                <classifier>deb</classifier>
                <type>deb</type>
                <destFileName>${pkg.name}.deb</destFileName>
                <outputDirectory>${project.build.directory}</outputDirectory>
            </artifactItem>
        </artifactItems>
    </configuration>
</execution>

5.3 maven-resources-plugin

作用: 复制 Dockerfile 和启动脚本到构建目录

示例:

<execution>
    <id>copy-docker-config</id>
    <phase>process-resources</phase>
    <goals>
        <goal>copy-resources</goal>
    </goals>
    <configuration>
        <outputDirectory>${project.build.directory}</outputDirectory>
        <resources>
            <resource>
                <directory>docker</directory>
                <filtering>true</filtering>  <!-- 支持变量替换 -->
            </resource>
        </resources>
    </configuration>
</execution>

5.4 frontend-maven-plugin

作用: 管理 Node.js 和 Yarn用于 web-ui 和 js-executor

功能:

  • 安装 Node.js 和 Yarn
  • 执行 yarn install
  • 执行 yarn run pkg

6. 构建目录结构

6.1 构建后的目录结构

每个 msa/*/target/ 目录包含:

msa/tb-node/target/
├── Dockerfile              # 从 docker/ 目录复制
├── start-tb-node.sh       # 从 docker/ 目录复制
├── logback.xml            # 从 docker/ 目录复制
└── thingsboard.deb        # 从 application/target/ 复制

6.2 Docker 构建上下文

dockerfile-maven-plugin 使用 target/ 目录作为构建上下文:

<contextDirectory>${project.build.directory}</contextDirectory>

7. 完整构建命令

7.1 构建所有镜像

# 构建所有 ThingsBoard 镜像
mvn clean install -DskipTests -Ddockerfile.skip=false

# 或使用 build.sh需要修改
./build.sh

7.2 构建特定镜像

# 构建单个镜像
mvn clean install -DskipTests -Ddockerfile.skip=false \
  --projects msa/tb-node --also-make

# 构建多个镜像
mvn clean install -DskipTests -Ddockerfile.skip=false \
  --projects msa/tb-node,msa/web-ui,msa/js-executor --also-make

7.3 构建并推送镜像

# 构建并推送到 Docker Hub
mvn clean install -DskipTests \
  -Ddockerfile.skip=false \
  -Dpush-docker-image=true

注意: 推送需要:

  1. Docker Hub 账号
  2. 登录: docker login
  3. 推送权限

8. 构建依赖关系

8.1 依赖顺序

1. common/* (公共模块)
   ↓
2. dao (数据访问层)
   ↓
3. application (主应用) → 生成 thingsboard.deb
   ↓
4. transport/* (传输模块) → 生成 tb-*-transport.deb
   ↓
5. ui-ngx (前端) → 生成 ui-ngx.jar
   ↓
6. msa/tb-node → 使用 thingsboard.deb
7. msa/transport/* → 使用 tb-*-transport.deb
8. msa/web-ui → 使用 ui-ngx.jar
9. msa/js-executor → 直接复制源码
10. msa/vc-executor-docker → 使用 vc-executor.deb
11. msa/edqs → 使用 edqs.deb

8.2 使用 --also-make 自动构建依赖

--also-make 参数会自动构建依赖的模块:

# 只需要指定 msa/tb-node会自动构建 application 模块
mvn clean install -DskipTests -Ddockerfile.skip=false \
  --projects msa/tb-node --also-make

9. 镜像标签和版本

9.1 标签生成

构建时会生成两个标签:

  1. 版本标签: thingsboard/tb-node:4.2.1
  2. Latest 标签: thingsboard/tb-node:latest(仅推送时)

9.2 版本来源

版本号来自根 pom.xml:

<version>4.2.1</version>

10. 基础镜像说明

10.1 thingsboard/openjdk17:bookworm-slim

用途: Java 服务的基础镜像

来源: ThingsBoard 团队维护的基础镜像

特点:

  • 基于 Debian Bookworm Slim
  • 包含 OpenJDK 17
  • 轻量级slim 版本)

10.2 thingsboard/node:22.18.0-bookworm-slim

用途: Node.js 服务的基础镜像

特点:

  • 基于 Debian Bookworm Slim
  • 包含 Node.js 22.18.0
  • 包含 Yarn

11. 构建产物位置

11.1 DEB 包位置

  • application/target/thingsboard-4.2.1-boot.deb
  • transport/mqtt/target/tb-mqtt-transport-4.2.1.deb
  • transport/http/target/tb-http-transport-4.2.1.deb
  • transport/coap/target/tb-coap-transport-4.2.1.deb
  • transport/lwm2m/target/tb-lwm2m-transport-4.2.1.deb
  • transport/snmp/target/tb-snmp-transport-4.2.1.deb

11.2 JAR 包位置

  • ui-ngx/target/ui-ngx-4.2.1.jar(包含前端静态资源)

11.3 Docker 镜像

构建完成后,镜像保存在本地 Docker

docker images | grep thingsboard

12. 关键文件位置总结

镜像 源码位置 Dockerfile pom.xml DEB/JAR 来源
tb-node application/ msa/tb-node/docker/Dockerfile msa/tb-node/pom.xml application/target/*.deb
tb-mqtt-transport transport/mqtt/ msa/transport/mqtt/docker/Dockerfile msa/transport/mqtt/pom.xml transport/mqtt/target/*.deb
tb-http-transport transport/http/ msa/transport/http/docker/Dockerfile msa/transport/http/pom.xml transport/http/target/*.deb
tb-coap-transport transport/coap/ msa/transport/coap/docker/Dockerfile msa/transport/coap/pom.xml transport/coap/target/*.deb
tb-lwm2m-transport transport/lwm2m/ msa/transport/lwm2m/docker/Dockerfile msa/transport/lwm2m/pom.xml transport/lwm2m/target/*.deb
tb-snmp-transport transport/snmp/ msa/transport/snmp/docker/Dockerfile msa/transport/snmp/pom.xml transport/snmp/target/*.deb
tb-web-ui ui-ngx/ msa/web-ui/docker/Dockerfile msa/web-ui/pom.xml ui-ngx/target/*.jar
tb-js-executor msa/js-executor/src/ msa/js-executor/docker/Dockerfile msa/js-executor/pom.xml 无(直接复制源码)
tb-vc-executor msa/vc-executor/ msa/vc-executor-docker/docker/Dockerfile msa/vc-executor-docker/pom.xml msa/vc-executor/target/*.deb
tb-edqs edqs/ msa/edqs/docker/Dockerfile msa/edqs/pom.xml edqs/target/*.deb

13. 总结

13.1 构建方式统计

  • DEB 包模式: 8个镜像tb-node、5个传输服务、vc-executor、edqs
  • 源码复制模式: 2个镜像web-ui、js-executor
  • 独立维护: 1个镜像haproxy-certbot不在当前仓库

13.2 构建工具

  • Maven: 统一构建工具
  • dockerfile-maven-plugin: Docker 镜像构建
  • Gradle: DEB 包构建(通过 Maven 调用)

13.3 关键发现

  1. 统一构建: 所有镜像都通过 Maven 统一构建
  2. 标准化: Java 服务使用 DEB 包Node.js 服务使用源码
  3. 模块化: 每个镜像都有独立的构建配置
  4. 可扩展: 支持添加新的镜像和服务

通过这个详细分析,可以清楚地了解 ThingsBoard 11 个自身镜像的完整打包流程和构建方式。