thingsboard/summary/13-Transport镜像构建与获取指南.md

16 KiB
Raw Permalink Blame History

ThingsBoard Transport 镜像构建与获取指南

1. Transport 镜像来源

1.1 官方镜像位置

ThingsBoard Transport 镜像发布在 Docker Hub

镜像仓库: thingsboard

可用镜像列表:

  • thingsboard/tb-mqtt-transport - MQTT 传输服务
  • thingsboard/tb-http-transport - HTTP 传输服务
  • thingsboard/tb-coap-transport - CoAP 传输服务
  • thingsboard/tb-lwm2m-transport - LWM2M 传输服务
  • thingsboard/tb-snmp-transport - SNMP 传输服务

Docker Hub 地址:

1.2 镜像标签

镜像使用版本标签,例如:

  • thingsboard/tb-mqtt-transport:4.2.1 - 特定版本
  • thingsboard/tb-mqtt-transport:latest - 最新版本

1.3 使用官方镜像

直接拉取官方镜像:

# 拉取 MQTT Transport 镜像
docker pull thingsboard/tb-mqtt-transport:4.2.1

# 拉取 HTTP Transport 镜像
docker pull thingsboard/tb-http-transport:4.2.1

# 拉取 CoAP Transport 镜像
docker pull thingsboard/tb-coap-transport:4.2.1

# 拉取 LWM2M Transport 镜像
docker pull thingsboard/tb-lwm2m-transport:4.2.1

# 拉取 SNMP Transport 镜像
docker pull thingsboard/tb-snmp-transport:4.2.1

2. Transport 镜像构建流程

2.1 构建架构

Transport 镜像的构建采用两阶段流程:

阶段1: Transport 模块构建
  transport/mqtt/ (源码)
    ↓ Maven 编译
    ↓ Gradle 打包
  tb-mqtt-transport-{version}.deb (DEB包)

阶段2: Docker 镜像构建
  msa/transport/mqtt/ (Docker配置)
    ↓ 依赖 transport/mqtt 的 DEB 包
    ↓ Dockerfile 构建
  thingsboard/tb-mqtt-transport:{version} (Docker镜像)

2.2 源码结构

thingsboard/
├── transport/                    # Transport 模块源码
│   ├── mqtt/                    # MQTT Transport 源码
│   │   ├── pom.xml              # Maven 配置
│   │   └── src/                 # 源代码
│   ├── http/                    # HTTP Transport 源码
│   ├── coap/                    # CoAP Transport 源码
│   ├── lwm2m/                   # LWM2M Transport 源码
│   └── snmp/                    # SNMP Transport 源码
│
└── msa/transport/               # Transport Docker 镜像构建
    ├── mqtt/                    # MQTT Transport Docker 配置
    │   ├── pom.xml              # Maven 配置(依赖 transport/mqtt DEB包
    │   └── docker/
    │       ├── Dockerfile       # Docker 构建文件
    │       └── start-tb-mqtt-transport.sh  # 启动脚本
    ├── http/                    # HTTP Transport Docker 配置
    ├── coap/                    # CoAP Transport Docker 配置
    ├── lwm2m/                   # LWM2M Transport Docker 配置
    └── snmp/                    # SNMP Transport Docker 配置

2.3 构建步骤详解

步骤1: 构建 Transport 模块 DEB 包

每个 transport 模块都需要先构建 DEB 包:

# 构建 MQTT Transport DEB 包
cd transport/mqtt
mvn clean package

# 生成的 DEB 包位置
# transport/mqtt/target/tb-mqtt-transport-4.2.1.deb

DEB 包内容:

  • JAR 文件Spring Boot 打包的应用)
  • 配置文件
  • 启动脚本

步骤2: 构建 Docker 镜像

msa/transport/mqtt/pom.xml 中的配置:

<dependencies>
    <!-- 依赖 transport/mqtt 模块的 DEB 包 -->
    <dependency>
        <groupId>org.thingsboard.transport</groupId>
        <artifactId>mqtt</artifactId>
        <version>${project.version}</version>
        <classifier>deb</classifier>
        <type>deb</type>
        <scope>provided</scope>
    </dependency>
</dependencies>

<build>
    <plugins>
        <!-- 复制 DEB 包到构建目录 -->
        <plugin>
            <groupId>org.apache.maven.plugins</groupId>
            <artifactId>maven-dependency-plugin</artifactId>
            <executions>
                <execution>
                    <id>copy-tb-mqtt-transport-deb</id>
                    <phase>package</phase>
                    <goals>
                        <goal>copy</goal>
                    </goals>
                    <configuration>
                        <artifactItems>
                            <artifactItem>
                                <groupId>org.thingsboard.transport</groupId>
                                <artifactId>mqtt</artifactId>
                                <classifier>deb</classifier>
                                <type>deb</type>
                                <destFileName>${pkg.name}.deb</destFileName>
                                <outputDirectory>${project.build.directory}</outputDirectory>
                            </artifactItem>
                        </artifactItems>
                    </configuration>
                </execution>
            </executions>
        </plugin>
        
        <!-- 复制 Docker 配置文件 -->
        <plugin>
            <groupId>org.apache.maven.plugins</groupId>
            <artifactId>maven-resources-plugin</artifactId>
            <executions>
                <execution>
                    <id>copy-docker-config</id>
                    <phase>process-resources</phase>
                    <goals>
                        <goal>copy-resources</goal>
                    </goals>
                    <configuration>
                        <outputDirectory>${project.build.directory}</outputDirectory>
                        <resources>
                            <resource>
                                <directory>docker</directory>
                                <filtering>true</filtering>
                            </resource>
                        </resources>
                    </configuration>
                </execution>
            </executions>
        </plugin>
        
        <!-- 构建 Docker 镜像 -->
        <plugin>
            <groupId>com.spotify</groupId>
            <artifactId>dockerfile-maven-plugin</artifactId>
            <executions>
                <execution>
                    <id>build-docker-image</id>
                    <phase>pre-integration-test</phase>
                    <goals>
                        <goal>build</goal>
                    </goals>
                    <configuration>
                        <skip>${dockerfile.skip}</skip>
                        <repository>${docker.repo}/${docker.name}</repository>
                        <contextDirectory>${project.build.directory}</contextDirectory>
                    </configuration>
                </execution>
            </executions>
        </plugin>
    </plugins>
</build>

Dockerfile (msa/transport/mqtt/docker/Dockerfile):

FROM thingsboard/openjdk17:bookworm-slim

# 复制启动脚本和 DEB 包
COPY start-tb-mqtt-transport.sh ${pkg.name}.deb /tmp/

# 安装 DEB 包
RUN chmod a+x /tmp/*.sh \
    && mv /tmp/start-tb-mqtt-transport.sh /usr/bin && \
    (yes | dpkg -i /tmp/${pkg.name}.deb) && \
    rm /tmp/${pkg.name}.deb && \
    (systemctl --no-reload disable --now ${pkg.name}.service > /dev/null 2>&1 || :) && \
    chmod 555 ${pkg.installFolder}/bin/${pkg.name}.jar

USER ${pkg.user}

CMD ["start-tb-mqtt-transport.sh"]

3. 如何构建 Transport 镜像

3.1 方法1: 使用 Maven 构建(推荐)

3.1.1 构建单个 Transport 镜像

# 构建 MQTT Transport 镜像
cd msa/transport/mqtt
mvn clean install -DskipTests -Ddockerfile.skip=false

# 构建 HTTP Transport 镜像
cd msa/transport/http
mvn clean install -DskipTests -Ddockerfile.skip=false

# 构建 CoAP Transport 镜像
cd msa/transport/coap
mvn clean install -DskipTests -Ddockerfile.skip=false

# 构建 LWM2M Transport 镜像
cd msa/transport/lwm2m
mvn clean install -DskipTests -Ddockerfile.skip=false

# 构建 SNMP Transport 镜像
cd msa/transport/snmp
mvn clean install -DskipTests -Ddockerfile.skip=false

3.1.2 构建所有 Transport 镜像

# 从项目根目录构建所有 transport 镜像
cd msa/transport
mvn clean install -DskipTests -Ddockerfile.skip=false

# 或者从项目根目录构建整个项目(包括 transport
cd ../..
mvn clean install -DskipTests -Ddockerfile.skip=false --projects msa/transport

3.1.3 构建并推送镜像到 Docker Hub

# 构建并推送镜像(需要 Docker Hub 认证)
mvn clean install -DskipTests \
  -Ddockerfile.skip=false \
  -Dpush-docker-image=true \
  --projects msa/transport/mqtt

注意: 推送镜像需要:

  1. Docker Hub 账号
  2. 登录 Docker Hub: docker login
  3. 配置 Maven 的 docker.repo 属性(默认是 thingsboard

3.2 方法2: 使用 build.sh 脚本

# 构建所有 transport 模块(不包括 Docker 镜像,默认跳过)
./build.sh msa/transport

# 注意build.sh 默认跳过 Docker 构建dockerfile.skip=true
# 需要手动设置环境变量或修改脚本

3.3 方法3: 直接使用 Dockerfile

如果已经有 DEB 包,可以直接使用 Dockerfile 构建:

# 1. 准备文件
cd msa/transport/mqtt/target
# 确保以下文件存在:
# - Dockerfile (从 docker/ 目录复制)
# - start-tb-mqtt-transport.sh (从 docker/ 目录复制)
# - tb-mqtt-transport.deb (从 transport/mqtt/target/ 复制)

# 2. 构建镜像
docker build -t thingsboard/tb-mqtt-transport:4.2.1 .

4. 构建依赖关系

4.1 构建顺序

Transport 镜像的构建依赖于以下模块:

1. common/* (公共模块)
   ↓
2. common/transport/* (传输层公共模块)
   ↓
3. transport/{protocol}/ (Transport 模块源码)
   ↓ 生成 DEB 包
4. msa/transport/{protocol}/ (Docker 镜像构建)
   ↓ 使用 DEB 包
5. Docker 镜像

4.2 正确的构建命令

# 方式1: 先构建 transport 模块,再构建 Docker 镜像
mvn clean install -DskipTests --projects transport/mqtt
mvn clean install -DskipTests -Ddockerfile.skip=false --projects msa/transport/mqtt

# 方式2: 使用 --also-make 自动构建依赖
mvn clean install -DskipTests -Ddockerfile.skip=false \
  --projects msa/transport/mqtt \
  --also-make

# 方式3: 从根目录构建整个项目(推荐)
mvn clean install -DskipTests -Ddockerfile.skip=false

5. 验证构建结果

5.1 检查镜像

# 查看本地镜像
docker images | grep thingsboard/tb-.*-transport

# 应该看到类似输出:
# thingsboard/tb-mqtt-transport    4.2.1    abc123def456   2 hours ago   500MB
# thingsboard/tb-http-transport     4.2.1    def456abc123   2 hours ago   450MB
# thingsboard/tb-coap-transport    4.2.1    ghi789jkl012   2 hours ago   480MB

5.2 测试镜像

# 运行 MQTT Transport 容器(测试)
docker run -it --rm \
  -e ZOOKEEPER_ENABLED=true \
  -e ZOOKEEPER_URL=zookeeper:2181 \
  -e TB_QUEUE_TYPE=kafka \
  -e TB_KAFKA_SERVERS=kafka:9092 \
  thingsboard/tb-mqtt-transport:4.2.1

6. 官方文档位置

6.1 ThingsBoard 官网

官方网站: https://thingsboard.io

文档位置:

6.2 GitHub 仓库

源码仓库: https://github.com/thingsboard/thingsboard

相关文件:

  • msa/transport/ - Transport Docker 镜像构建配置
  • transport/ - Transport 模块源码
  • docker/ - Docker Compose 配置示例

6.3 Docker Hub

Docker Hub 组织: https://hub.docker.com/u/thingsboard

可用镜像:

6.4 官方文档搜索关键词

在 ThingsBoard 官方文档中搜索以下关键词:

  • "transport" - 传输服务相关文档
  • "microservices" - 微服务部署文档
  • "docker" - Docker 部署文档
  • "MQTT transport" - MQTT 传输服务文档
  • "HTTP transport" - HTTP 传输服务文档

7. 常见问题

7.1 问题1: DEB 包找不到

错误信息:

Could not find artifact org.thingsboard.transport:mqtt:deb:4.2.1

原因: Transport 模块的 DEB 包还没有构建

解决方案:

# 先构建 transport 模块
mvn clean install -DskipTests --projects transport/mqtt

# 然后再构建 Docker 镜像
mvn clean install -DskipTests -Ddockerfile.skip=false --projects msa/transport/mqtt

7.2 问题2: Docker 构建被跳过

原因: 默认配置 dockerfile.skip=true

解决方案:

# 添加 -Ddockerfile.skip=false 参数
mvn clean install -DskipTests -Ddockerfile.skip=false

7.3 问题3: 镜像推送到 Docker Hub 失败

错误信息:

denied: requested access to the resource is denied

原因: 未登录 Docker Hub 或没有推送权限

解决方案:

# 1. 登录 Docker Hub
docker login

# 2. 确保有推送权限(镜像仓库必须是 your-username/tb-mqtt-transport
# 或者修改 docker.repo 属性
mvn clean install -DskipTests -Ddockerfile.skip=false \
  -Ddocker.repo=your-username \
  -Dpush-docker-image=true

7.4 问题4: 构建时间过长

原因: Maven 需要下载依赖和编译代码

优化方案:

# 1. 使用并行构建
mvn clean install -DskipTests -Ddockerfile.skip=false -T4

# 2. 只构建需要的模块
mvn clean install -DskipTests -Ddockerfile.skip=false \
  --projects msa/transport/mqtt \
  --also-make

# 3. 使用本地 Maven 仓库缓存
# 确保 ~/.m2/repository 中有依赖

8. 镜像标签和版本

8.1 版本标签

镜像使用项目版本作为标签:

# 查看项目版本pom.xml
grep "<version>" pom.xml | head -1

# 镜像标签格式
thingsboard/tb-mqtt-transport:{version}
# 例如thingsboard/tb-mqtt-transport:4.2.1

8.2 Latest 标签

构建时会自动创建 latest 标签:

# 推送 latest 标签(在 push-docker-image profile 中)
mvn clean install -DskipTests \
  -Ddockerfile.skip=false \
  -Dpush-docker-image=true

9. 构建环境要求

9.1 必需工具

  • Java 17: 编译 Java 代码
  • Maven 3.6+: 构建工具
  • Docker: 构建 Docker 镜像
  • Gradle: 构建 DEB 包Maven 会自动调用)

9.2 系统要求

  • 内存: 至少 4GB推荐 8GB+
  • 磁盘空间: 至少 5GB 可用空间
  • 操作系统: Linux/macOSWindows 需要 WSL

10. 总结

10.1 镜像来源

  1. 官方镜像: Docker Hub thingsboard/tb-{protocol}-transport
  2. 源码构建: 从 GitHub 源码构建
  3. DEB 包: 可以单独下载 DEB 包安装

10.2 构建方法

  1. Maven 构建(推荐): mvn clean install -DskipTests -Ddockerfile.skip=false
  2. 直接 Dockerfile: 使用已有的 DEB 包和 Dockerfile
  3. CI/CD: 集成到持续集成流程

10.3 官方文档位置

10.4 关键文件位置

  • Dockerfile: msa/transport/{protocol}/docker/Dockerfile
  • Maven 配置: msa/transport/{protocol}/pom.xml
  • 源码: transport/{protocol}/
  • 启动脚本: msa/transport/{protocol}/docker/start-tb-{protocol}-transport.sh

通过以上方式,您可以获取或构建 ThingsBoard Transport 的 Docker 镜像。