thingsboard/summary/19-ThingsBoard所有镜像打包命令.md

13 KiB
Raw Permalink Blame History

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 DesktopMac

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 .

完成!