20 KiB
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 镜像使用两种基础镜像:
-
Java 服务镜像:
thingsboard/openjdk17:bookworm-slim- 用于:tb-node、传输服务、vc-executor、edqs
-
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/
构建流程:
-
Maven 配置 (
msa/tb-node/pom.xml):<!-- 依赖 application 模块的 DEB 包 --> <dependency> <groupId>org.thingsboard</groupId> <artifactId>application</artifactId> <classifier>deb</classifier> <type>deb</type> </dependency> -
构建步骤:
maven-dependency-plugin: 复制 DEB 包到target/目录maven-resources-plugin: 复制 Dockerfile 和启动脚本到target/目录dockerfile-maven-plugin: 执行 Docker 构建
-
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"] -
关键文件:
- DEB 包:
thingsboard-{version}-boot.deb(来自application/模块) - 启动脚本:
start-tb-node.sh - 日志配置:
logback.xml
- DEB 包:
-
服务区分:
- 通过环境变量
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/
构建流程:
-
Maven 配置 (
msa/transport/mqtt/pom.xml):<dependency> <groupId>org.thingsboard.transport</groupId> <artifactId>mqtt</artifactId> <classifier>deb</classifier> <type>deb</type> </dependency> -
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/
构建流程:
-
Maven 配置 (
msa/web-ui/pom.xml):<!-- 依赖 ui-ngx 模块的 JAR 包(包含前端静态资源) --> <dependency> <groupId>org.thingsboard</groupId> <artifactId>ui-ngx</artifactId> <type>jar</type> </dependency> -
构建步骤:
frontend-maven-plugin: 安装 Node.js 和 Yarn(用于本地开发)maven-dependency-plugin: 解压ui-ngxJAR 包,提取前端静态资源maven-resources-plugin: 复制源代码和配置文件dockerfile-maven-plugin: 执行 Docker 构建
-
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"] -
关键特点:
- ✅ 使用 Node.js 基础镜像(不是 Java)
- ✅ 直接复制源代码(不使用 DEB 包)
- ✅ 前端静态资源来自
ui-ngxJAR 包 - ✅ 在容器内安装 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/
构建流程:
-
Maven 配置 (
msa/js-executor/pom.xml):- 使用
frontend-maven-plugin管理 Node.js 和 Yarn - 使用
maven-resources-plugin复制源代码
- 使用
-
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"] -
关键特点:
- ✅ 使用 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/
构建流程:
-
Maven 配置 (
msa/vc-executor-docker/pom.xml):<dependency> <groupId>org.thingsboard.msa</groupId> <artifactId>vc-executor</artifactId> <classifier>deb</classifier> <type>deb</type> </dependency> -
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"] -
关键特点:
- ✅ 使用 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/
构建流程:
-
Maven 配置 (
msa/edqs/pom.xml):<dependency> <groupId>org.thingsboard</groupId> <artifactId>edqs</artifactId> <classifier>deb</classifier> <type>deb</type> </dependency> -
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"] -
关键特点:
- ✅ 使用 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-transporttb-http-transporttb-coap-transporttb-lwm2m-transporttb-snmp-transporttb-vc-executortb-edqs
构建流程:
Java 源码 → Maven 编译 → Gradle 打包 DEB → Dockerfile 安装 DEB → Docker 镜像
特点:
- ✅ 标准化安装流程
- ✅ 统一的文件结构
- ✅ 自动权限管理
4.2 模式2: 源代码 + Node.js 基础镜像(2个镜像)
适用镜像:
tb-web-uitb-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-imageprofile)
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
注意: 推送需要:
- Docker Hub 账号
- 登录:
docker login - 推送权限
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 标签生成
构建时会生成两个标签:
- 版本标签:
thingsboard/tb-node:4.2.1 - 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.debtransport/mqtt/target/tb-mqtt-transport-4.2.1.debtransport/http/target/tb-http-transport-4.2.1.debtransport/coap/target/tb-coap-transport-4.2.1.debtransport/lwm2m/target/tb-lwm2m-transport-4.2.1.debtransport/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 关键发现
- ✅ 统一构建: 所有镜像都通过 Maven 统一构建
- ✅ 标准化: Java 服务使用 DEB 包,Node.js 服务使用源码
- ✅ 模块化: 每个镜像都有独立的构建配置
- ✅ 可扩展: 支持添加新的镜像和服务
通过这个详细分析,可以清楚地了解 ThingsBoard 11 个自身镜像的完整打包流程和构建方式。