# ThingsBoard 所有镜像打包命令 ## 位置 项目根目录:`/Users/sunpeng/workspace/things/thingsboard/` --- ## ⚠️ 重要:先拉取基础镜像 所有 ThingsBoard 镜像都依赖以下**基础镜像**,需要先拉取: ```bash # 拉取 Java 服务基础镜像(tb-node、传输服务等需要) docker pull thingsboard/openjdk17:bookworm-slim # 拉取 Node.js 服务基础镜像(tb-web-ui、tb-js-executor 需要) docker pull thingsboard/node:22.18.0-bookworm-slim ``` **如果网络有问题**,可以尝试: ```bash # 使用国内镜像源 docker pull docker.xuanyuan.me/library/debian:bookworm-slim # 或者使用阿里云镜像 docker pull registry.cn-hangzhou.aliyuncs.com/library/debian:bookworm-slim ``` **说明**:这些基础镜像由 ThingsBoard 官方在 Docker Hub 维护,包含预装的 OpenJDK 17 和 Node.js 22.18.0。 --- ## 单个镜像打包命令 ### 1. tb-node 镜像(核心服务 + 规则引擎) ```bash mvn clean install -DskipTests -Ddockerfile.skip=false --projects msa/tb-node --also-make ``` **依赖**: `application` 模块(自动构建) **验证**: `docker images | grep tb-node` --- ### 2. tb-mqtt-transport 镜像 ```bash mvn clean install -DskipTests -Ddockerfile.skip=false --projects msa/transport/mqtt --also-make ``` **依赖**: `transport/mqtt` 模块(自动构建) **验证**: `docker images | grep tb-mqtt-transport` --- ### 3. tb-http-transport 镜像 ```bash mvn clean install -DskipTests -Ddockerfile.skip=false --projects msa/transport/http --also-make ``` **依赖**: `transport/http` 模块(自动构建) **验证**: `docker images | grep tb-http-transport` --- ### 4. tb-coap-transport 镜像 ```bash mvn clean install -DskipTests -Ddockerfile.skip=false --projects msa/transport/coap --also-make ``` **依赖**: `transport/coap` 模块(自动构建) **验证**: `docker images | grep tb-coap-transport` --- ### 5. tb-lwm2m-transport 镜像 ```bash mvn clean install -DskipTests -Ddockerfile.skip=false --projects msa/transport/lwm2m --also-make ``` **依赖**: `transport/lwm2m` 模块(自动构建) **验证**: `docker images | grep tb-lwm2m-transport` --- ### 6. tb-snmp-transport 镜像 ```bash mvn clean install -DskipTests -Ddockerfile.skip=false --projects msa/transport/snmp --also-make ``` **依赖**: `transport/snmp` 模块(自动构建) **验证**: `docker images | grep tb-snmp-transport` --- ### 7. tb-web-ui 镜像 ```bash mvn clean install -DskipTests -Ddockerfile.skip=false --projects msa/web-ui --also-make ``` **依赖**: `ui-ngx` 模块(自动构建) **验证**: `docker images | grep tb-web-ui` --- ### 8. tb-js-executor 镜像 ```bash mvn clean install -DskipTests -Ddockerfile.skip=false --projects msa/js-executor --also-make ``` **说明**: 直接复制源码,无需 DEB 包 **验证**: `docker images | grep tb-js-executor` --- ### 9. tb-vc-executor 镜像 ```bash mvn clean install -DskipTests -Ddockerfile.skip=false --projects msa/vc-executor-docker --also-make ``` **依赖**: `msa/vc-executor` 模块(自动构建) **验证**: `docker images | grep tb-vc-executor` --- ### 10. tb-edqs 镜像 ```bash mvn clean install -DskipTests -Ddockerfile.skip=false --projects msa/edqs --also-make ``` **依赖**: `edqs` 模块(自动构建) **验证**: `docker images | grep tb-edqs` --- ## 批量构建命令 ### 构建所有传输服务(5个) ```bash mvn clean install -DskipTests -Ddockerfile.skip=false --projects msa/transport --also-make ``` 这会构建: - tb-mqtt-transport - tb-http-transport - tb-coap-transport - tb-lwm2m-transport - tb-snmp-transport --- ### 构建所有 ThingsBoard 镜像(10个) ```bash mvn clean install -DskipTests -Ddockerfile.skip=false --projects msa --also-make ``` 或者指定所有模块: ```bash mvn clean install -DskipTests -Ddockerfile.skip=false \ --projects msa/tb-node,msa/transport,msa/web-ui,msa/js-executor,msa/vc-executor-docker,msa/edqs \ --also-make ``` --- ## 命令参数说明 ### `mvn clean install` - **clean**: 清理之前的构建产物(删除 `target/` 目录) - **install**: 编译、打包并安装到本地 Maven 仓库(`~/.m2/repository`) ### `-DskipTests` - **作用**: 跳过运行测试用例 - **原因**: 测试耗时长,打包镜像时通常不需要 ### `-Ddockerfile.skip=false` - **作用**: 启用 Docker 镜像构建 - **说明**: 默认 `dockerfile.skip=true`(跳过 Docker 构建),需要设置为 `false` 才会构建镜像 ### `--projects <模块路径>` - **作用**: 只构建指定的模块 - **说明**: 如果不指定,会构建整个项目的所有模块 ### `--also-make` - **作用**: 自动构建依赖的模块 - **说明**: 例如 `msa/tb-node` 依赖 `application` 模块,会自动先构建 `application`,再构建 `msa/tb-node` --- ## 验证所有镜像 ```bash docker images | grep thingsboard ``` 应该看到所有镜像: ``` thingsboard/tb-node 4.2.1 ... thingsboard/tb-mqtt-transport 4.2.1 ... thingsboard/tb-http-transport 4.2.1 ... thingsboard/tb-coap-transport 4.2.1 ... thingsboard/tb-lwm2m-transport 4.2.1 ... thingsboard/tb-snmp-transport 4.2.1 ... thingsboard/tb-web-ui 4.2.1 ... thingsboard/tb-js-executor 4.2.1 ... thingsboard/tb-vc-executor 4.2.1 ... thingsboard/tb-edqs 4.2.1 ... ``` --- ## Mac M1 芯片解决方案 ### 问题 `dockerfile-maven-plugin` 在 Mac M1 上有架构兼容性问题,会报错: ``` UnsatisfiedLinkError: ... missing compatible architecture (have 'i386,x86_64', need 'arm64e' or 'arm64') ``` **原因**: `dockerfile-maven-plugin` 1.4.13 版本使用的 FFI 库不支持 ARM64 架构。 ### 解决方案:两阶段构建(推荐) #### 步骤1:构建代码和 DEB 包(跳过 Docker) ```bash # 在项目根目录 mvn clean install -DskipTests --projects msa/tb-node --also-make ``` 这会: - ✅ 编译代码 - ✅ 生成 DEB 包 - ✅ 复制 Dockerfile 和启动脚本到 `msa/tb-node/target/` - ❌ 跳过 Docker 镜像构建(避免插件错误) #### 步骤2:手动构建 Docker 镜像 ```bash # 进入构建目录 cd msa/tb-node/target # 查看版本号(如果需要) grep -A 1 "version" ../../pom.xml | head -1 # 手动执行 docker build(替换 4.2.1 为实际版本号) docker build -t thingsboard/tb-node:4.2.1 . ``` **说明**: - Dockerfile 已经复制到 `target/` 目录 - DEB 包也在 `target/` 目录 - 启动脚本也在 `target/` 目录 - 直接 `docker build` 即可 ### 获取版本号 ```bash # 方法1:查看根 pom.xml grep "" pom.xml | head -1 # 方法2:查看构建后的目录名 ls msa/tb-node/target/ | grep deb # 输出: thingsboard-4.2.1.deb (版本号是 4.2.1) ``` --- ## 常见问题 ### 1. Mac M1 架构兼容性问题 **错误**: `UnsatisfiedLinkError: missing compatible architecture` **解决**: 使用两阶段构建(见上面的"Mac M1 芯片解决方案") ### 2. Docker daemon 未运行 **错误**: `Cannot connect to the Docker daemon` **解决**: ```bash # 检查 Docker 状态 docker ps # 如果未运行,启动 Docker Desktop(Mac) ``` ### 3. 依赖模块未构建 **错误**: `Could not find artifact org.thingsboard:application:deb:4.2.1` **解决**: 确保使用 `--also-make` 参数,或者先手动构建依赖: ```bash # 先构建 application 模块 mvn clean install -DskipTests --projects application # 再构建 tb-node mvn clean install -DskipTests --projects msa/tb-node ``` ### 4. 内存不足 **错误**: `java.lang.OutOfMemoryError` **解决**: 增加 Maven 内存 ```bash MAVEN_OPTS="-Xmx2048m" mvn clean install -DskipTests --projects msa/tb-node --also-make ``` --- ## Mac M1 完整构建命令 ### 通用步骤(所有镜像都一样) ```bash # 步骤1:构建代码和依赖(项目根目录) mvn clean install -DskipTests --projects msa/<模块名> --also-make # 步骤2:进入构建目录 cd msa/<模块名>/target # 步骤3:查看版本号(可选) ls *.deb # 查看 DEB 包名称,获取版本号 # 步骤4:手动构建镜像(替换 VERSION 为实际版本号) docker build -t thingsboard/<镜像名>:VERSION . ``` ### 具体示例 #### 1. tb-node 镜像 ```bash # 步骤1 mvn clean install -DskipTests --projects msa/tb-node --also-make # 步骤2 cd msa/tb-node/target # 步骤3 docker build -t thingsboard/tb-node:4.2.1 . ``` #### 2. tb-mqtt-transport 镜像 ```bash # 步骤1 mvn clean install -DskipTests --projects msa/transport/mqtt --also-make # 步骤2 cd msa/transport/mqtt/target # 步骤3 docker build -t thingsboard/tb-mqtt-transport:4.2.1 . ``` #### 3. tb-web-ui 镜像(特殊:pkg 在 Mac M1 会失败) **问题**: `pkg` 命令会在 macOS M1 上失败(无法构建 Linux 二进制),但 Docker 只需要 `server.js` 源码。 **什么是 pkg?** - `pkg` 是一个 Node.js 工具,用于将整个 Node.js 应用打包成单个可执行文件 - Docker 不需要这个可执行文件,只需要编译后的 `server.js` 源码 **为什么慢?** - `pkg` 需要从 GitHub 下载 Node.js 二进制文件(大小约 30-40MB) - 如果网络慢或 GitHub 连接不稳定,下载会很慢或失败 **解决方案:手动编译 TypeScript** ```bash # 步骤1:构建 ui-ngx 依赖(项目根目录) mvn clean install -DskipTests --projects ui-ngx # 步骤2:进入 web-ui 目录 cd msa/web-ui # 步骤3:安装依赖 yarn install # 步骤4:只编译 TypeScript(跳过 pkg) npx tsc # 步骤5:确认编译成功 ls target/src/server.js # 步骤6:返回根目录继续 Maven 构建(但跳过 pkg) cd ../.. # 步骤7:用 Maven 继续构建(会跳过 pkg,但会失败,不影响) # 或者直接手动复制文件并构建 Docker 镜像 # 步骤8:手动复制必要文件到 target/src(如果 Maven 没有自动复制) # msa/web-ui/target/ 目录应该有 Dockerfile # 步骤9:进入 target 构建 Docker 镜像 cd msa/web-ui/target docker build -t thingsboard/tb-web-ui:4.2.1 . ``` **或者:先让 pkg 失败,然后手动修复** ```bash # 步骤1:让 Maven 构建失败(pkg 会失败,但 tsc 已经成功) mvn clean install -DskipTests --projects msa/web-ui --also-make || true # 步骤2:检查 server.js 是否已生成 ls msa/web-ui/target/src/server.js # 步骤3:如果已生成,直接构建 Docker 镜像 cd msa/web-ui/target docker build -t thingsboard/tb-web-ui:4.2.1 . ``` #### 4. tb-js-executor 镜像(特殊:pkg 在 Mac M1 会失败) **问题**: `pkg` 命令会在 macOS M1 上失败(无法构建 Linux 二进制),但 Docker 只需要 `server.js` 源码。 **什么是 pkg?** - `pkg` 是一个 Node.js 工具,用于将整个 Node.js 应用打包成单个可执行文件(类似 Java 的 jar) - 例如:`pkg -t node22-linux-x64` 会生成一个 Linux 可执行文件 - **但 Docker 不需要这个可执行文件!** Docker 只需要编译后的 `server.js` 源码,然后在容器内用 `node server.js` 运行 **为什么慢?** - `pkg` 需要从 GitHub 下载 Node.js 二进制文件(大小约 30-40MB) - 命令会显示:`Fetching base Node.js binaries to PKG_CACHE_PATH` - 如果网络慢或 GitHub 连接不稳定,下载会很慢或失败 - 这些二进制文件存在 `~/.pkg-cache/` 目录,但首次下载很慢 **解决方案:手动编译 TypeScript** ```bash # 步骤1:进入 js-executor 目录 cd msa/js-executor # 步骤2:安装依赖 yarn install # 步骤3:只编译 TypeScript(跳过 pkg) npx tsc # 步骤4:确认编译成功 ls target/src/server.js # 步骤5:让 Maven 继续构建(pkg 会失败,但会生成 package/linux/conf 等必要文件) # ⚠️ 注意:这里不加 || true,因为 Maven 会失败,但已经生成了必要文件 cd ../.. mvn clean install -DskipTests --projects msa/js-executor --also-make # 即使看到错误信息,docker 镜像构建所需文件已经生成,继续步骤6 # 步骤6:进入 target 构建 Docker 镜像 cd msa/js-executor/target docker build -t thingsboard/tb-js-executor:4.2.1 . ``` #### 5. tb-http-transport 镜像 ```bash # 步骤1 mvn clean install -DskipTests --projects msa/transport/http --also-make # 步骤2 cd msa/transport/http/target # 步骤3 docker build -t thingsboard/tb-http-transport:4.2.1 . ``` #### 6. tb-coap-transport 镜像 ```bash # 步骤1 mvn clean install -DskipTests --projects msa/transport/coap --also-make # 步骤2 cd msa/transport/coap/target # 步骤3 docker build -t thingsboard/tb-coap-transport:4.2.1 . ``` #### 7. tb-lwm2m-transport 镜像 ```bash # 步骤1 mvn clean install -DskipTests --projects msa/transport/lwm2m --also-make # 步骤2 cd msa/transport/lwm2m/target # 步骤3 docker build -t thingsboard/tb-lwm2m-transport:4.2.1 . ``` #### 8. tb-snmp-transport 镜像 ```bash # 步骤1 mvn clean install -DskipTests --projects msa/transport/snmp --also-make # 步骤2 cd msa/transport/snmp/target # 步骤3 docker build -t thingsboard/tb-snmp-transport:4.2.1 . ``` #### 9. tb-vc-executor 镜像 ```bash # 步骤1 mvn clean install -DskipTests --projects msa/vc-executor-docker --also-make # 步骤2 cd msa/vc-executor-docker/target # 步骤3 docker build -t thingsboard/tb-vc-executor:4.2.1 . ``` #### 10. tb-edqs 镜像 ```bash # 步骤1 mvn clean install -DskipTests --projects msa/edqs --also-make # 步骤2 cd msa/edqs/target # 步骤3 docker build -t thingsboard/tb-edqs:4.2.1 . ``` --- 完成!