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

733 lines
20 KiB
Markdown
Raw Permalink Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

# 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
<!-- 依赖 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`):
```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
<dependency>
<groupId>org.thingsboard.transport</groupId>
<artifactId>mqtt</artifactId>
<classifier>deb</classifier>
<type>deb</type>
</dependency>
```
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
<!-- 依赖 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`):
```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
<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`):
```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
<dependency>
<groupId>org.thingsboard</groupId>
<artifactId>edqs</artifactId>
<classifier>deb</classifier>
<type>deb</type>
</dependency>
```
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
<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`):
```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 和启动脚本到构建目录
**示例**:
```xml
<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/` 目录作为构建上下文:
```xml
<contextDirectory>${project.build.directory}</contextDirectory>
```
## 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
<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
```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 个自身镜像的完整打包流程和构建方式。