构建多架构(amd、arm)zookeeper集群镜像

本文介绍了在信创环境下,如何使用Dockerfile构建支持ARM和AMD架构的Zookeeper镜像,包括dockerfile中的配置、docker-entrypoint.sh脚本和多阶段构建过程,以便于在不同的容器部署环境中进行快速扩容和管理。
摘要由CSDN通过智能技术生成

一、背景

        在信创的背景下,很多时候需要在多种架构运行服务,通过buildx可以构建镜像在多个环境(arm、amd)能够部署,以下dockerfile文件可做参考(用的官方的改的,提前下好二进制包,示例环境用的是zookeeper:3.8.4),通过sts部署时候扩容还是挺方便的,只需要扩副本数以及ZOO_SERVERS

官网链接:

zookeeper官网下载:Apache ZooKeeper

dockerhub: https://github.com/31z4/zookeeper-docker

二、dockerfile

FROM eclipse-temurin:17-jre-jammy

ENV ZOO_CONF_DIR=/conf \
    ZOO_DATA_DIR=/data \
    ZOO_PORT=2181 \
    ZOO_DATA_LOG_DIR=/data \
    ZOO_TICK_TIME=2000 \
    ZOO_INIT_LIMIT=5 \
    ZOO_SYNC_LIMIT=2 \
    ZOO_AUTOPURGE_PURGEINTERVAL=0 \
    ZOO_AUTOPURGE_SNAPRETAINCOUNT=3 \
    ZOO_MAX_CLIENT_CNXNS=60 \
    ZOO_ADMINSERVER_ENABLED=true

# Add a user with an explicit UID/GID and create necessary directories
RUN set -eux; \
    groupadd -r zookeeper --gid=1000; \
    useradd -r -g zookeeper --uid=1000 zookeeper; \
    mkdir -p "$ZOO_DATA_LOG_DIR" "$ZOO_DATA_DIR" "$ZOO_CONF_DIR"; \
    chown zookeeper:zookeeper "$ZOO_DATA_LOG_DIR" "$ZOO_DATA_DIR" "$ZOO_CONF_DIR" 

# Install required packges
RUN set -eux; \
    apt-get update; \
    DEBIAN_FRONTEND=noninteractive \
    apt-get install -y --no-install-recommends \
        ca-certificates \
        dirmngr \
        bash \
        gnupg \
        netcat \
        net-tools \
        wget; \
    rm -rf /var/lib/apt/lists/*; \


ARG SHORT_DISTRO_NAME=zookeeper-3.8.4
ARG DISTRO_NAME=apache-zookeeper-3.8.4-bin
COPY apache-zookeeper-3.8.4-bin.tar.gz /

RUN set -eux; \
    tar -zxf "$DISTRO_NAME.tar.gz"; \
    mv "$DISTRO_NAME/conf/"* "$ZOO_CONF_DIR"; \
    rm -rf  "$DISTRO_NAME.tar.gz"; \
    chown -R zookeeper:zookeeper "/$DISTRO_NAME"

WORKDIR $DISTRO_NAME
VOLUME ["$ZOO_DATA_DIR", "$ZOO_DATA_LOG_DIR"]

EXPOSE $ZOO_PORT 2888 3888 

ENV PATH=$PATH:/$DISTRO_NAME/bin \
    ZOOCFGDIR=$ZOO_CONF_DIR

COPY docker-entrypoint.sh /
RUN ["chmod", "777", "/docker-entrypoint.sh"]
RUN ["chmod", "777", "/data"]
RUN ["chmod", "777", "/conf"]
ENTRYPOINT ["/docker-entrypoint.sh"]
CMD ["zkServer.sh", "start-foreground"]

三、docker-entrypoint.sh

#!/bin/bash

set -e

# Allow the container to be started with `--user`
if [[ "$1" = 'zkServer.sh' && "$(id -u)" = '0' ]]; then
    chown -R "$ZOO_USER" "$ZOO_DATA_DIR" "$ZOO_DATA_LOG_DIR"
    exec su "$ZOO_USER" "$0" "$@"
fi


# Generate the config only if it doesn't exist
if [[ ! -f "$ZOO_CONF_DIR/zoo.cfg" ]]; then
    CONFIG="$ZOO_CONF_DIR/zoo.cfg"

    echo "clientPort=$ZOO_PORT" >> "$CONFIG"
    echo "dataDir=$ZOO_DATA_DIR" >> "$CONFIG"
    echo "dataLogDir=$ZOO_DATA_LOG_DIR" >> "$CONFIG"

    echo "tickTime=$ZOO_TICK_TIME" >> "$CONFIG"
    echo "initLimit=$ZOO_INIT_LIMIT" >> "$CONFIG"
    echo "syncLimit=$ZOO_SYNC_LIMIT" >> "$CONFIG"
    echo "autopurge.purgeInterval=$ZOO_AUTO_INTERVAL" >> "$CONFIG"
    echo "autopurge.snapRetainCount=$ZOO_AUTO_RETAINCOUNT" >> "$CONFIG"

    echo "maxClientCnxns=$ZOO_MAX_CLIENT_CNXNS" >> "$CONFIG"

    echo "quorumListenOnAllIPs=true" >> "$CONFIG"

    for server in $ZOO_SERVERS; do
        echo "$server" >> "$CONFIG"
    done
fi


HOST_NUM=${HOSTNAME##*-}
ZOO_MY_ID=$((HOST_NUM + 1))

if [[ ! -f "$ZOO_DATA_DIR/myid" ]]; then
    echo "${ZOO_MY_ID:-1}" > "$ZOO_DATA_DIR/myid"
fi

exec "$@"

四、构建

会推送至目的仓库

docker buildx build -platform linux/amd64,linux/amd64 -t imageName . --push

  • 9
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 5
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值