前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >【Docker】RocketMQ 源码构建 Docker 镜像(基于 ARM 64 架构)

【Docker】RocketMQ 源码构建 Docker 镜像(基于 ARM 64 架构)

作者头像
行者Sun
发布2024-09-02 11:56:15
1740
发布2024-09-02 11:56:15
举报
文章被收录于专栏:Docker

以下内容均来自个人笔记并重新梳理,如有错误欢迎指正!

如果对您有帮助,烦请点赞、关注、转发!如果您有其他想要了解的,欢迎私信联系我~

背景介绍

接上篇,笔者完成公司 MySQL 适配 ARM 64 架构工作后,马上又着手推进 RocketMQ 适配 ARM 64 架构,同样由于 Docker Hub 官方未提供 RocketMQ 的 ARM 64 镜像,遂针对 RocketMQ 4.9.4 版本自行构建 ARM 64 镜像,以下为完整过程。

过程回顾

1、获取 Dockerfile

使用 dfimage 工具获取 RocketMQ 4.9.4 官方镜像原始的 Dockerfile。

代码语言:javascript
复制
alias dfimage="docker run -v /var/run/docker.sock:/var/run/docker.sock --rm alpine/dfimage"
dfimage -sV=1.36 apache/rocketmq:4.9.4 > /root/rocketmq_rebuild/Dockerfile

这里需要说明几点:

1、RocketMQ 是使用 Java 语言开发的项目,原 Dockerfile 是直接下载编译好的 jar 包进行镜像构建,但在实测中发现已经编译好的 jar 包在执行 Topic 初始化脚本等操作时,会频繁出现报错:invokeSync call the addr[null] timeout。经排查发现是 RocketMQ 代码中默认超时时间(3000ms 或 5000ms)过短导致的,如部分 Topic 创建时的实际执行时间为 5413ms。

解决方案是:修改源码中 broker、client、openmessaging、remoting、tools 等 distribution 下的相关源码并重新编译。

2、原 Dockerfile 中替换了原有的 runserver-customize.sh、runbroker-customize.sh 文件,可以从 RocketMQ 4.9.4 的 AMD 64 镜像中获取。

附 rocketmq 项目地址:https://github.com/apache/rocketmq

2、编译源码生成 rpm

2.1、在 ARM 环境安装依赖

代码语言:javascript
复制
yum install -y maven-3.0.5-17.el7.noarch

2.2、下载源码

代码语言:javascript
复制
wget https://github.com/apache/rocketmq/archive/refs/tags/rocketmq-all-4.9.4.tar.gz

2.3、编译源码生成 jar 包

代码语言:javascript
复制
tar -xzvf rocketmq-all-4.9.4.tar.gz
cd rocketmq-rocketmq-all-4.9.4
# 修改以下源码文件中的超时时间为 10000ms:
# broker/src/main/java/org/apache/rocketmq/broker/out/BrokerOuterAPI.java
# client/src/main/java/org/apache/rocketmq/client/producer/DefaultMQProducer.java
# client/src/main/java/org/apache/rocketmq/client/impl/consumer/ConsumeMessageConcurrentlyService.java
# client/src/main/java/org/apache/rocketmq/client/trace/AsyncTraceDispatcher.java
# openmessaging/src/main/java/io/openmessaging/rocketmq/config/ClientConfig.java
# openmessaging/src/main/java/io/openmessaging/rocketmq/promise/DefaultPromise.java
# remoting/src/main/java/org/apache/rocketmq/remoting/netty/NettyRemotingClient.java
# tools/src/main/java/org/apache/rocketmq/tools/admin/DefaultMQAdminExt.java
mvn -Prelease-all -DskipTests -Dspotbugs.skip=true clean install -U

提示:执行时间较长,可以在 broker、client、openmessaging、remoting、tools 编译完成后中断即可

生成的 jar 包位于 rocketmq-rocketmq-all-4.9.4/<distribution>/target 目录下,如 rocketmq-rocketmq-all-4.9.4/broker/target

3、构建镜像

代码语言:javascript
复制
cd /root/rocketmq_rebuild && tree
目录结构如下,部分文件的详细内容见附录:
├── Dockerfile
├── jar
│   ├── rocketmq-broker-4.9.4.jar
│   ├── rocketmq-client-4.9.4.jar
│   ├── rocketmq-openmessaging-4.9.4.jar
│   ├── rocketmq-remoting-4.9.4.jar
│   └── rocketmq-tools-4.9.4.jar
├── rocketmq-rocketmq-all-4.9.4.tgz
├── runbroker-customize.sh
└── runserver-customize.sh

docker build --pull --platform=linux/arm64 -t rocketmq:4.9.4-armtest -f Dockerfile . --no-cache

附录

Dockerfile

代码语言:javascript
复制
FROM centos:centos7

LABEL org.label-schema.schema-version=1.0 org.label-schema.name=CentOS_Base_Image org.label-schema.vendor=CentOS org.label-schema.license=GPLv2 org.label-schema.build-date=20231229 org.opencontainers.image.title=CentOS_Base_Image org.opencontainers.image.vendor=CentOS org.opencontainers.image.licenses=GPL-2.0-only org.opencontainers.image.created=2023-12-29-00:00:00+00:00 rebuild_author=Sunzemin

CMD ["/bin/bash"]
RUN yum install -y java-1.8.0-openjdk-devel.aarch64 unzip gettext nmap-ncat which telnet && yum clean all -y

ARG user=rocketmq
ARG group=rocketmq
ARG uid=3000
ARG gid=3000
RUN groupadd -g ${gid} ${group} && useradd -u ${uid} -g ${gid} -m -s /bin/bash ${user}

ARG version
ENV ROCKETMQ_VERSION=4.9.4
ENV ROCKETMQ_HOME=/home/rocketmq/rocketmq-4.9.4
WORKDIR /home/rocketmq/rocketmq-4.9.4
RUN set -eux; curl -L https://archive.apache.org/dist/rocketmq/${ROCKETMQ_VERSION}/rocketmq-all-${ROCKETMQ_VERSION}-bin-release.zip -o rocketmq.zip; unzip rocketmq.zip ; mv rocketmq*/* . ; rmdir rocketmq-* ; rm rocketmq.zip ; rm ${ROCKETMQ_HOME}/lib/rocketmq-remoting-4.9.4.jar
COPY jar/ ${ROCKETMQ_HOME}/lib/
RUN chown -R ${uid}:${gid} ${ROCKETMQ_HOME}

COPY runserver-customize.sh runbroker-customize.sh /home/rocketmq/rocketmq-4.9.4/bin/
EXPOSE 9876
RUN mv ${ROCKETMQ_HOME}/bin/runserver-customize.sh ${ROCKETMQ_HOME}/bin/runserver.sh \
        && chmod a+x ${ROCKETMQ_HOME}/bin/runserver.sh \
        && chmod a+x ${ROCKETMQ_HOME}/bin/mqnamesrv
EXPOSE 10909 10911 10912
RUN mv ${ROCKETMQ_HOME}/bin/runbroker-customize.sh ${ROCKETMQ_HOME}/bin/runbroker.sh \
        && chmod a+x ${ROCKETMQ_HOME}/bin/runbroker.sh \
        && chmod a+x ${ROCKETMQ_HOME}/bin/mqbroker

RUN export JAVA_OPT=" -Duser.home=/opt"
RUN sed -i 's/${JAVA_HOME}\/jre\/lib\/ext/${JAVA_HOME}\/jre\/lib\/ext:${JAVA_HOME}\/lib\/ext/' ${ROCKETMQ_HOME}/bin/tools.sh

USER rocketmq
WORKDIR /home/rocketmq/rocketmq-4.9.4/bin
本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2024-01-12,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 实施运维知识交流 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
相关产品与服务
容器服务
腾讯云容器服务(Tencent Kubernetes Engine, TKE)基于原生 kubernetes 提供以容器为核心的、高度可扩展的高性能容器管理服务,覆盖 Serverless、边缘计算、分布式云等多种业务部署场景,业内首创单个集群兼容多种计算节点的容器资源管理模式。同时产品作为云原生 Finops 领先布道者,主导开源项目Crane,全面助力客户实现资源优化、成本控制。
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档