一、背景
在信创的背景下,很多时候需要在多种架构运行服务,通过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