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

555 lines
13 KiB
Markdown
Raw Permalink Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

# 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 .
```
---
完成!