• linux上构建任意版本的rocketmq多架构x86 arm镜像——筑梦之路


    现状

    目前市面上和官方均只有rocketmq x86架构下的docker镜像,而随着国产化和信创适配的需求越来越多,显然现有的x86架构下的docker镜像不能满足多样化的需求,因此我们需要根据官方发布的版本制作满足需求的多架构镜像,以在不同cpu架构下部署使用。

     rocketmq官方网站:RocketMQ · 官方网站 | RocketMQ

    关于rocketmq的介绍请阅读官方文档,这里就不做过多赘述。

    前提条件

    1. 构建镜像的机器需要能访问互联网,拥有良好的网络环境

    2. 构建之前请搭建好私有仓库,比如harbor、registry这种,以便将多架构镜像推送到镜像仓库中

    3. 需要安装docker,版本要求19.03以上,并支持buildx插件

    准备工作

     1. 编写Dockerfile文件

    1. # 多阶段构建方式
    2. cat Dockerfile-centos
    3. ################################################################################
    4. # Build stage 1 `builder`:
    5. # Download and extract RocketMQ
    6. ################################################################################
    7. FROM eclipse-temurin:8-jdk-centos7 AS builder
    8. ARG version
    9. RUN set -eux \
    10. && yum -y update \
    11. && yum -y install curl gnupg unzip \
    12. && yum clean all -y
    13. RUN curl -L https://archive.apache.org/dist/rocketmq/${version}/rocketmq-all-${version}-bin-release.zip -o rocketmq.zip \
    14. && curl -L https://archive.apache.org/dist/rocketmq/${version}/rocketmq-all-${version}-bin-release.zip.asc -o rocketmq.zip.asc \
    15. && curl -L https://www.apache.org/dist/rocketmq/KEYS -o KEYS \
    16. && gpg --import KEYS \
    17. && gpg --batch --verify rocketmq.zip.asc rocketmq.zip
    18. RUN unzip rocketmq.zip \
    19. && mkdir -p /tmp/rocketmq-${version} \
    20. && mv rocketmq*/* /tmp/rocketmq-${version}
    21. ################################################################################
    22. # Build stage 2:
    23. # Make the actual RocketMQ docker image
    24. ################################################################################
    25. FROM eclipse-temurin:8-jdk-centos7
    26. ARG user=rocketmq
    27. ARG group=rocketmq
    28. ARG uid=3000
    29. ARG gid=3000
    30. ARG version
    31. # Rocketmq version
    32. ENV ROCKETMQ_VERSION ${version}
    33. # Rocketmq home
    34. ENV ROCKETMQ_HOME /home/rocketmq/rocketmq-${ROCKETMQ_VERSION}
    35. # expose namesrv port
    36. EXPOSE 9876
    37. # expose broker ports
    38. EXPOSE 10909 10911 10912
    39. # RocketMQ is run with user `rocketmq`, uid = 3000
    40. # If you bind mount a volume from the host or a data container,
    41. # ensure you use the same uid
    42. RUN groupadd -g ${gid} ${group} \
    43. && useradd -l -u ${uid} -g ${gid} -m -s /bin/bash ${user} \
    44. && yum -y update \
    45. && yum -y install less openssl which bash wget curl tzdata \
    46. && yum clean all -y && rm -rf /var/cache/yum
    47. # Copy customized scripts
    48. COPY scripts/ ${ROCKETMQ_HOME}/bin/
    49. # Copy RocketMQ artifact from builder
    50. COPY --from=builder --chown=${uid}:${gid} /tmp/rocketmq-${version}/ ${ROCKETMQ_HOME}
    51. # Override customized scripts for namesrv
    52. # Override customized scripts for broker
    53. # Export Java options
    54. # Add ${JAVA_HOME}/lib/ext as java.ext.dirs
    55. RUN mv ${ROCKETMQ_HOME}/bin/runserver-customize.sh ${ROCKETMQ_HOME}/bin/runserver.sh \
    56. && mv ${ROCKETMQ_HOME}/bin/runbroker-customize.sh ${ROCKETMQ_HOME}/bin/runbroker.sh \
    57. && chmod -R a+x ${ROCKETMQ_HOME}/bin/ \
    58. && export JAVA_OPT=" -Duser.home=/opt" \
    59. && sed -i 's/${JAVA_HOME}\/jre\/lib\/ext/${JAVA_HOME}\/jre\/lib\/ext:${JAVA_HOME}\/lib\/ext/' ${ROCKETMQ_HOME}/bin/tools.sh \
    60. && chown -R ${uid}:${gid} ${ROCKETMQ_HOME} \
    61. && localedef -i en_US -f UTF-8 en_US.UTF-8 \
    62. && ln -sf /usr/share/zoneinfo/Asia/Shanghai /etc/localtime \
    63. && export LANG=C.UTF-8
    64. USER ${user}
    65. WORKDIR ${ROCKETMQ_HOME}/bin
    66. ENTRYPOINT ["./docker-entrypoint.sh"]
    67. # Dummy overridable parameter parsed by entrypoint
    68. CMD ["dummy"]

    2. 编写需要的脚本文件

    1. # 脚本文件docker-entrypoint.sh
    2. cat docker-entrypoint.sh
    3. #!/bin/bash
    4. set -e
    5. # Allow user specify custom CMD, maybe run /bin/bash to check the image
    6. if [[ "$1" == "nameserver" || "${NODE_ROLE}" == "nameserver" ]]; then
    7. shift
    8. exec ./mqnamesrv "${@}"
    9. elif [[ "$1" == "broker" || "${NODE_ROLE}" == "broker" ]]; then
    10. shift
    11. exec ./mqbroker "${@}"
    12. elif [[ "$1" == "controller" || "${NODE_ROLE}" == "controller" ]]; then
    13. shift
    14. exec ./mqcontroller "${@}"
    15. else
    16. # Run whatever command the user wants
    17. exec "$@"
    18. fi
    1. # 脚本文件 runbroker-customize.sh
    2. #!/bin/bash
    3. # Licensed to the Apache Software Foundation (ASF) under one or more
    4. # contributor license agreements. See the NOTICE file distributed with
    5. # this work for additional information regarding copyright ownership.
    6. # The ASF licenses this file to You under the Apache License, Version 2.0
    7. # (the "License"); you may not use this file except in compliance with
    8. # the License. You may obtain a copy of the License at
    9. #
    10. # http://www.apache.org/licenses/LICENSE-2.0
    11. #
    12. # Unless required by applicable law or agreed to in writing, software
    13. # distributed under the License is distributed on an "AS IS" BASIS,
    14. # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
    15. # See the License for the specific language governing permissions and
    16. # limitations under the License.
    17. #===========================================================================================
    18. # Java Environment Setting
    19. #===========================================================================================
    20. error_exit ()
    21. {
    22. echo "ERROR: $1 !!"
    23. exit 1
    24. }
    25. find_java_home()
    26. {
    27. case "`uname`" in
    28. Darwin)
    29. JAVA_HOME=$(/usr/libexec/java_home)
    30. ;;
    31. *)
    32. JAVA_HOME=$(dirname $(dirname $(readlink -f $(which javac))))
    33. ;;
    34. esac
    35. }
    36. find_java_home
    37. [ ! -e "$JAVA_HOME/bin/java" ] && JAVA_HOME=$HOME/jdk/java
    38. [ ! -e "$JAVA_HOME/bin/java" ] && JAVA_HOME=/usr/java
    39. [ ! -e "$JAVA_HOME/bin/java" ] && error_exit "Please set the JAVA_HOME variable in your environment, We need java(x64)!"
    40. export JAVA_HOME
    41. export JAVA="$JAVA_HOME/bin/java"
    42. export BASE_DIR=$(dirname $0)/..
    43. export CLASSPATH=.:${BASE_DIR}/conf:${CLASSPATH}
    44. #===========================================================================================
    45. # JVM Configuration
    46. #===========================================================================================
    47. calculate_heap_sizes()
    48. {
    49. case "`uname`" in
    50. Linux)
    51. system_memory_in_mb=`free -m| sed -n '2p' | awk '{print $2}'`
    52. system_cpu_cores=`egrep -c 'processor([[:space:]]+):.*' /proc/cpuinfo`
    53. ;;
    54. FreeBSD)
    55. system_memory_in_bytes=`sysctl hw.physmem | awk '{print $2}'`
    56. system_memory_in_mb=`expr $system_memory_in_bytes / 1024 / 1024`
    57. system_cpu_cores=`sysctl hw.ncpu | awk '{print $2}'`
    58. ;;
    59. SunOS)
    60. system_memory_in_mb=`prtconf | awk '/Memory size:/ {print $3}'`
    61. system_cpu_cores=`psrinfo | wc -l`
    62. ;;
    63. Darwin)
    64. system_memory_in_bytes=`sysctl hw.memsize | awk '{print $2}'`
    65. system_memory_in_mb=`expr $system_memory_in_bytes / 1024 / 1024`
    66. system_cpu_cores=`sysctl hw.ncpu | awk '{print $2}'`
    67. ;;
    68. *)
    69. # assume reasonable defaults for e.g. a modern desktop or
    70. # cheap server
    71. system_memory_in_mb="2048"
    72. system_cpu_cores="2"
    73. ;;
    74. esac
    75. # some systems like the raspberry pi don't report cores, use at least 1
    76. if [ "$system_cpu_cores" -lt "1" ]
    77. then
    78. system_cpu_cores="1"
    79. fi
    80. # set max heap size based on the following
    81. # max(min(1/2 ram, 1024MB), min(1/4 ram, 8GB))
    82. # calculate 1/2 ram and cap to 1024MB
    83. # calculate 1/4 ram and cap to 8192MB
    84. # pick the max
    85. half_system_memory_in_mb=`expr $system_memory_in_mb / 2`
    86. quarter_system_memory_in_mb=`expr $half_system_memory_in_mb / 2`
    87. if [ "$half_system_memory_in_mb" -gt "1024" ]
    88. then
    89. half_system_memory_in_mb="1024"
    90. fi
    91. if [ "$quarter_system_memory_in_mb" -gt "8192" ]
    92. then
    93. quarter_system_memory_in_mb="8192"
    94. fi
    95. if [ "$half_system_memory_in_mb" -gt "$quarter_system_memory_in_mb" ]
    96. then
    97. max_heap_size_in_mb="$half_system_memory_in_mb"
    98. else
    99. max_heap_size_in_mb="$quarter_system_memory_in_mb"
    100. fi
    101. MAX_HEAP_SIZE="${max_heap_size_in_mb}M"
    102. # Young gen: min(max_sensible_per_modern_cpu_core * num_cores, 1/4 * heap size)
    103. max_sensible_yg_per_core_in_mb="100"
    104. max_sensible_yg_in_mb=`expr $max_sensible_yg_per_core_in_mb "*" $system_cpu_cores`
    105. desired_yg_in_mb=`expr $max_heap_size_in_mb / 4`
    106. if [ "$desired_yg_in_mb" -gt "$max_sensible_yg_in_mb" ]
    107. then
    108. HEAP_NEWSIZE="${max_sensible_yg_in_mb}M"
    109. else
    110. HEAP_NEWSIZE="${desired_yg_in_mb}M"
    111. fi
    112. }
    113. calculate_heap_sizes
    114. # Dynamically calculate parameters, for reference.
    115. Xms=$MAX_HEAP_SIZE
    116. Xmx=$MAX_HEAP_SIZE
    117. Xmn=$HEAP_NEWSIZE
    118. MaxDirectMemorySize=$MAX_HEAP_SIZE
    119. # Set for `JAVA_OPT`.
    120. JAVA_OPT="${JAVA_OPT} -server -Xms${Xms} -Xmx${Xmx} -Xmn${Xmn}"
    121. JAVA_OPT="${JAVA_OPT} -XX:+UseG1GC -XX:G1HeapRegionSize=16m -XX:G1ReservePercent=25 -XX:InitiatingHeapOccupancyPercent=30 -XX:SoftRefLRUPolicyMSPerMB=0 -XX:SurvivorRatio=8"
    122. JAVA_OPT="${JAVA_OPT} -verbose:gc -Xloggc:/dev/shm/mq_gc_%p.log -XX:+PrintGCDetails -XX:+PrintGCDateStamps -XX:+PrintGCApplicationStoppedTime -XX:+PrintAdaptiveSizePolicy"
    123. JAVA_OPT="${JAVA_OPT} -XX:+UseGCLogFileRotation -XX:NumberOfGCLogFiles=5 -XX:GCLogFileSize=30m"
    124. JAVA_OPT="${JAVA_OPT} -XX:-OmitStackTraceInFastThrow"
    125. JAVA_OPT="${JAVA_OPT} -XX:+AlwaysPreTouch"
    126. JAVA_OPT="${JAVA_OPT} -XX:MaxDirectMemorySize=${MaxDirectMemorySize}"
    127. JAVA_OPT="${JAVA_OPT} -XX:-UseLargePages -XX:-UseBiasedLocking"
    128. JAVA_OPT="${JAVA_OPT} -Djava.ext.dirs=${JAVA_HOME}/jre/lib/ext:${BASE_DIR}/lib"
    129. #JAVA_OPT="${JAVA_OPT} -Xdebug -Xrunjdwp:transport=dt_socket,address=9555,server=y,suspend=n"
    130. JAVA_OPT="${JAVA_OPT} ${JAVA_OPT_EXT}"
    131. JAVA_OPT="${JAVA_OPT} -cp ${CLASSPATH}"
    132. numactl --interleave=all pwd > /dev/null 2>&1
    133. if [ $? -eq 0 ]
    134. then
    135. if [ -z "$RMQ_NUMA_NODE" ] ; then
    136. numactl --interleave=all $JAVA ${JAVA_OPT} $@
    137. else
    138. numactl --cpunodebind=$RMQ_NUMA_NODE --membind=$RMQ_NUMA_NODE $JAVA ${JAVA_OPT} $@
    139. fi
    140. else
    141. $JAVA ${JAVA_OPT} $@
    142. fi
    1. # 脚本文件 runserver-customize.sh
    2. #!/bin/bash
    3. # Licensed to the Apache Software Foundation (ASF) under one or more
    4. # contributor license agreements. See the NOTICE file distributed with
    5. # this work for additional information regarding copyright ownership.
    6. # The ASF licenses this file to You under the Apache License, Version 2.0
    7. # (the "License"); you may not use this file except in compliance with
    8. # the License. You may obtain a copy of the License at
    9. #
    10. # http://www.apache.org/licenses/LICENSE-2.0
    11. #
    12. # Unless required by applicable law or agreed to in writing, software
    13. # distributed under the License is distributed on an "AS IS" BASIS,
    14. # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
    15. # See the License for the specific language governing permissions and
    16. # limitations under the License.
    17. #===========================================================================================
    18. # Java Environment Setting
    19. #===========================================================================================
    20. error_exit ()
    21. {
    22. echo "ERROR: $1 !!"
    23. exit 1
    24. }
    25. find_java_home()
    26. {
    27. case "`uname`" in
    28. Darwin)
    29. JAVA_HOME=$(/usr/libexec/java_home)
    30. ;;
    31. *)
    32. JAVA_HOME=$(dirname $(dirname $(readlink -f $(which javac))))
    33. ;;
    34. esac
    35. }
    36. find_java_home
    37. [ ! -e "$JAVA_HOME/bin/java" ] && JAVA_HOME=$HOME/jdk/java
    38. [ ! -e "$JAVA_HOME/bin/java" ] && JAVA_HOME=/usr/java
    39. [ ! -e "$JAVA_HOME/bin/java" ] && error_exit "Please set the JAVA_HOME variable in your environment, We need java(x64)!"
    40. export JAVA_HOME
    41. export JAVA="$JAVA_HOME/bin/java"
    42. export BASE_DIR=$(dirname $0)/..
    43. export CLASSPATH=.:${BASE_DIR}/conf:${CLASSPATH}
    44. #===========================================================================================
    45. # JVM Configuration
    46. #===========================================================================================
    47. calculate_heap_sizes()
    48. {
    49. case "`uname`" in
    50. Linux)
    51. system_memory_in_mb=`free -m| sed -n '2p' | awk '{print $2}'`
    52. system_cpu_cores=`egrep -c 'processor([[:space:]]+):.*' /proc/cpuinfo`
    53. ;;
    54. FreeBSD)
    55. system_memory_in_bytes=`sysctl hw.physmem | awk '{print $2}'`
    56. system_memory_in_mb=`expr $system_memory_in_bytes / 1024 / 1024`
    57. system_cpu_cores=`sysctl hw.ncpu | awk '{print $2}'`
    58. ;;
    59. SunOS)
    60. system_memory_in_mb=`prtconf | awk '/Memory size:/ {print $3}'`
    61. system_cpu_cores=`psrinfo | wc -l`
    62. ;;
    63. Darwin)
    64. system_memory_in_bytes=`sysctl hw.memsize | awk '{print $2}'`
    65. system_memory_in_mb=`expr $system_memory_in_bytes / 1024 / 1024`
    66. system_cpu_cores=`sysctl hw.ncpu | awk '{print $2}'`
    67. ;;
    68. *)
    69. # assume reasonable defaults for e.g. a modern desktop or
    70. # cheap server
    71. system_memory_in_mb="2048"
    72. system_cpu_cores="2"
    73. ;;
    74. esac
    75. # some systems like the raspberry pi don't report cores, use at least 1
    76. if [ "$system_cpu_cores" -lt "1" ]
    77. then
    78. system_cpu_cores="1"
    79. fi
    80. # set max heap size based on the following
    81. # max(min(1/2 ram, 1024MB), min(1/4 ram, 8GB))
    82. # calculate 1/2 ram and cap to 1024MB
    83. # calculate 1/4 ram and cap to 8192MB
    84. # pick the max
    85. half_system_memory_in_mb=`expr $system_memory_in_mb / 2`
    86. quarter_system_memory_in_mb=`expr $half_system_memory_in_mb / 2`
    87. if [ "$half_system_memory_in_mb" -gt "1024" ]
    88. then
    89. half_system_memory_in_mb="1024"
    90. fi
    91. if [ "$quarter_system_memory_in_mb" -gt "8192" ]
    92. then
    93. quarter_system_memory_in_mb="8192"
    94. fi
    95. if [ "$half_system_memory_in_mb" -gt "$quarter_system_memory_in_mb" ]
    96. then
    97. max_heap_size_in_mb="$half_system_memory_in_mb"
    98. else
    99. max_heap_size_in_mb="$quarter_system_memory_in_mb"
    100. fi
    101. MAX_HEAP_SIZE="${max_heap_size_in_mb}M"
    102. # Young gen: min(max_sensible_per_modern_cpu_core * num_cores, 1/4 * heap size)
    103. max_sensible_yg_per_core_in_mb="100"
    104. max_sensible_yg_in_mb=`expr $max_sensible_yg_per_core_in_mb "*" $system_cpu_cores`
    105. desired_yg_in_mb=`expr $max_heap_size_in_mb / 4`
    106. if [ "$desired_yg_in_mb" -gt "$max_sensible_yg_in_mb" ]
    107. then
    108. HEAP_NEWSIZE="${max_sensible_yg_in_mb}M"
    109. else
    110. HEAP_NEWSIZE="${desired_yg_in_mb}M"
    111. fi
    112. }
    113. calculate_heap_sizes
    114. # Dynamically calculate parameters, for reference.
    115. Xms=$MAX_HEAP_SIZE
    116. Xmx=$MAX_HEAP_SIZE
    117. Xmn=$HEAP_NEWSIZE
    118. # Set for `JAVA_OPT`.
    119. JAVA_OPT="${JAVA_OPT} -server -Xms${Xms} -Xmx${Xmx} -Xmn${Xmn}"
    120. JAVA_OPT="${JAVA_OPT} -XX:+UseConcMarkSweepGC -XX:+UseCMSCompactAtFullCollection -XX:CMSInitiatingOccupancyFraction=70 -XX:+CMSParallelRemarkEnabled -XX:SoftRefLRUPolicyMSPerMB=0 -XX:+CMSClassUnloadingEnabled -XX:SurvivorRatio=8 -XX:-UseParNewGC"
    121. JAVA_OPT="${JAVA_OPT} -verbose:gc -Xloggc:/dev/shm/rmq_srv_gc.log -XX:+PrintGCDetails"
    122. JAVA_OPT="${JAVA_OPT} -XX:-OmitStackTraceInFastThrow"
    123. JAVA_OPT="${JAVA_OPT} -XX:-UseLargePages"
    124. JAVA_OPT="${JAVA_OPT} -Djava.ext.dirs=${JAVA_HOME}/jre/lib/ext:${BASE_DIR}/lib"
    125. #JAVA_OPT="${JAVA_OPT} -Xdebug -Xrunjdwp:transport=dt_socket,address=9555,server=y,suspend=n"
    126. JAVA_OPT="${JAVA_OPT} ${JAVA_OPT_EXT}"
    127. JAVA_OPT="${JAVA_OPT} -cp ${CLASSPATH}"
    128. $JAVA ${JAVA_OPT} $@

    编写构建脚本build-image.sh

    1. # 构建镜像的脚本
    2. #!/usr/bin/env bash
    3. checkVersion() {
    4. echo "Version = $1"
    5. echo $1 |grep -E "^[0-9]+\.[0-9]+\.[0-9]+" > /dev/null
    6. if [ $? = 0 ]; then
    7. return 1
    8. fi
    9. echo "Version $1 illegal, it should be X.X.X format(e.g. 4.5.0), please check released versions in 'https://archive.apache.org/dist/rocketmq/'"
    10. exit -1
    11. }
    12. if [ $# -lt 2 ]; then
    13. echo -e "Usage: sh $0 Version BaseImage"
    14. exit -1
    15. fi
    16. ROCKETMQ_VERSION=$1
    17. BASE_IMAGE=centos
    18. checkVersion $ROCKETMQ_VERSION
    19. # Build rocketmq
    20. case "${BASE_IMAGE}" in
    21. centos)
    22. docker run --privileged --rm harbor.codemiracle.com.cn/baseapp/binfmt:latest --install all
    23. docker buildx create --use --name=mybuilder-rocketmq --driver docker-container --driver-opt image=harbor.codemiracle.com.cn/baseapp/buildkit:master
    24. docker buildx build --no-cache -f Dockerfile-centos --platform=linux/amd64,linux/arm64 -t harbor.codemiracle.com.cn/baseapp/rocketmq:${ROCKETMQ_VERSION} --build-arg version=${ROCKETMQ_VERSION} . --push
    25. docker buildx rm mybuilder-rocketmq
    26. ;;
    27. *)
    28. echo "${BASE_IMAGE} is not supported, supported base images: centos"
    29. exit -1
    30. ;;
    31. esac

    如何构建

    1. # 如何使用脚本构建呢?
    2. 1. 创建相关目录,将文件放到对应目录下
    3. mkdir scripts
    4. mv docker-entrypoint.sh scripts/
    5. mv runbroker-customize.sh scripts/
    6. mv runserver-customize.sh scripts/
    7. 2. 登陆harbor
    8. docker login harbor.codemiracle.com.cn
    9. 3. 执行构建脚本
    10. sh build-image.sh [rocketmq版本号]
    11. eg:
    12. sh build-image.sh 4.5.2

    如何部署

    https://blog.csdn.net/qq_34777982/article/details/133806164 

    参考资料:

    GitHub - apache/rocketmq-docker: Apache RocketMQ Docker

  • 相关阅读:
    ZooKeeper调优
    如何学好次世代角色建模?
    VirtualLab基础实验教程-8.傅里叶变换(1)
    C++11 --- lambda表达式
    知识星球2023年10月PHP函数小挑战
    MacOs 删除第三方软件
    js图像对比可用的一些资源
    python开发面试-20240715
    mysqlbinlog和binlog2sql的使用及mysql通过binlog日志恢复数据
    Node.js 基础学习
  • 原文地址:https://blog.csdn.net/qq_34777982/article/details/133804725