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

555 lines
13 KiB
Markdown
Raw Permalink Normal View History

2026-01-19 11:50:37 +08:00
# 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 "<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`
**解决**:
```bash
# 检查 Docker 状态
docker ps
# 如果未运行,启动 Docker DesktopMac
```
### 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 .
```
---
完成!