# 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 个自身镜像的完整打包流程和构建方式。