13 KiB
ThingsBoard 所有镜像打包命令
位置
项目根目录:/Users/sunpeng/workspace/things/thingsboard/
⚠️ 重要:先拉取基础镜像
所有 ThingsBoard 镜像都依赖以下基础镜像,需要先拉取:
# 拉取 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
如果网络有问题,可以尝试:
# 使用国内镜像源
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 镜像(核心服务 + 规则引擎)
mvn clean install -DskipTests -Ddockerfile.skip=false --projects msa/tb-node --also-make
依赖: application 模块(自动构建)
验证: docker images | grep tb-node
2. tb-mqtt-transport 镜像
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 镜像
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 镜像
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 镜像
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 镜像
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 镜像
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 镜像
mvn clean install -DskipTests -Ddockerfile.skip=false --projects msa/js-executor --also-make
说明: 直接复制源码,无需 DEB 包
验证: docker images | grep tb-js-executor
9. tb-vc-executor 镜像
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 镜像
mvn clean install -DskipTests -Ddockerfile.skip=false --projects msa/edqs --also-make
依赖: edqs 模块(自动构建)
验证: docker images | grep tb-edqs
批量构建命令
构建所有传输服务(5个)
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个)
mvn clean install -DskipTests -Ddockerfile.skip=false --projects msa --also-make
或者指定所有模块:
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
验证所有镜像
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)
# 在项目根目录
mvn clean install -DskipTests --projects msa/tb-node --also-make
这会:
- ✅ 编译代码
- ✅ 生成 DEB 包
- ✅ 复制 Dockerfile 和启动脚本到
msa/tb-node/target/ - ❌ 跳过 Docker 镜像构建(避免插件错误)
步骤2:手动构建 Docker 镜像
# 进入构建目录
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即可
获取版本号
# 方法1:查看根 pom.xml
grep "<version>" 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
解决:
# 检查 Docker 状态
docker ps
# 如果未运行,启动 Docker Desktop(Mac)
3. 依赖模块未构建
错误: Could not find artifact org.thingsboard:application:deb:4.2.1
解决: 确保使用 --also-make 参数,或者先手动构建依赖:
# 先构建 application 模块
mvn clean install -DskipTests --projects application
# 再构建 tb-node
mvn clean install -DskipTests --projects msa/tb-node
4. 内存不足
错误: java.lang.OutOfMemoryError
解决: 增加 Maven 内存
MAVEN_OPTS="-Xmx2048m" mvn clean install -DskipTests --projects msa/tb-node --also-make
Mac M1 完整构建命令
通用步骤(所有镜像都一样)
# 步骤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 镜像
# 步骤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 镜像
# 步骤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
# 步骤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 失败,然后手动修复
# 步骤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
# 步骤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 镜像
# 步骤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 镜像
# 步骤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 镜像
# 步骤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 镜像
# 步骤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 镜像
# 步骤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 镜像
# 步骤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 .
完成!