# 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`):
```xml
org.thingsboard
application
deb
deb
```
2. **构建步骤**:
- `maven-dependency-plugin`: 复制 DEB 包到 `target/` 目录
- `maven-resources-plugin`: 复制 Dockerfile 和启动脚本到 `target/` 目录
- `dockerfile-maven-plugin`: 执行 Docker 构建
3. **Dockerfile** (`msa/tb-node/docker/Dockerfile`):
```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` → 规则引擎服务
**构建命令**:
```bash
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`):
```xml
org.thingsboard.transport
mqtt
deb
deb
```
2. **Dockerfile** (`msa/transport/mqtt/docker/Dockerfile`):
```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` 构建
**构建命令**:
```bash
# 构建所有传输服务
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`):
```xml
org.thingsboard
ui-ngx
jar
```
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`):
```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 依赖
**构建命令**:
```bash
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`):
```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 包
**构建命令**:
```bash
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`):
```xml
org.thingsboard.msa
vc-executor
deb
deb
```
2. **Dockerfile** (`msa/vc-executor-docker/docker/Dockerfile`):
```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 配置目录
**构建命令**:
```bash
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`):
```xml
org.thingsboard
edqs
deb
deb
```
2. **Dockerfile** (`msa/edqs/docker/Dockerfile`):
```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 构建模式相同
**构建命令**:
```bash
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 中的使用**:
```yaml
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`):
```xml
com.spotify
dockerfile-maven-plugin
1.4.13
```
**执行阶段**: `pre-integration-test`
**功能**:
- `build`: 构建镜像
- `tag`: 打标签
- `push`: 推送镜像(需要 `push-docker-image` profile)
### 5.2 maven-dependency-plugin
**作用**: 复制依赖的 DEB 包或 JAR 包到构建目录
**示例** (`msa/tb-node/pom.xml`):
```xml
copy-tb-deb
package
copy
org.thingsboard
application
deb
deb
${pkg.name}.deb
${project.build.directory}
```
### 5.3 maven-resources-plugin
**作用**: 复制 Dockerfile 和启动脚本到构建目录
**示例**:
```xml
copy-docker-config
process-resources
copy-resources
${project.build.directory}
docker
true
```
### 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/` 目录作为构建上下文:
```xml
${project.build.directory}
```
## 7. 完整构建命令
### 7.1 构建所有镜像
```bash
# 构建所有 ThingsBoard 镜像
mvn clean install -DskipTests -Ddockerfile.skip=false
# 或使用 build.sh(需要修改)
./build.sh
```
### 7.2 构建特定镜像
```bash
# 构建单个镜像
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 构建并推送镜像
```bash
# 构建并推送到 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` 参数会自动构建依赖的模块:
```bash
# 只需要指定 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`:
```xml
4.2.1
```
## 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:
```bash
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 个自身镜像的完整打包流程和构建方式。