From 49d77c8c1c03d3f28ac789144e74587222c5901c Mon Sep 17 00:00:00 2001 From: Sebastian Mandrean Date: Fri, 18 Feb 2022 15:59:38 +0100 Subject: [PATCH] Add Zookeeper multi-arch support --- .travis.yml | 66 ++++++++++++++++++++++++++++++++++ Dockerfile | 75 +++++++++++++++++++++++++-------------- docker_buildx | 32 +++++++++++++++++ docker_push | 15 ++++++++ start-zk.sh | 2 +- test/verifyImageLabels.sh | 21 +++++++++++ 6 files changed, 183 insertions(+), 28 deletions(-) create mode 100644 .travis.yml create mode 100755 docker_buildx create mode 100755 docker_push create mode 100755 test/verifyImageLabels.sh diff --git a/.travis.yml b/.travis.yml new file mode 100644 index 0000000..0af2d7b --- /dev/null +++ b/.travis.yml @@ -0,0 +1,66 @@ +sudo: required + +language: java + +services: + - docker + +# This version will be also tagged as 'latest' +env: + global: + - LATEST="3.7.0" + +matrix: + include: + - jdk: openjdk11 + env: ZOOKEEPER_VERSION=3.7.0 JAVA_VERSION=11-jre-slim + +# Upgrade Docker Engine so we can use buildx +before_install: + - curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo apt-key add - + - sudo add-apt-repository "deb [arch=amd64] https://download.docker.com/linux/ubuntu $(lsb_release -cs) stable" + - sudo apt-get update + - sudo apt-get -y -o Dpkg::Options::="--force-confnew" install docker-ce + +install: + - docker --version + - docker buildx version + - docker-compose --version + - echo "ZOOKEEPER VERSION $ZOOKEEPER_VERSION" + - echo "JAVA VERSION $JAVA_VERSION" + - echo "LATEST VERSION $LATEST" + - if [ -z ${DOCKER_PASSWORD+x} ]; then echo "Using unauthenticated pulls on PR"; else echo "$DOCKER_PASSWORD" | docker login -u "$DOCKER_USERNAME" --password-stdin; fi + - export CURRENT=${ZOOKEEPER_VERSION} + + # Prepare the environment for multi-arch builds + - docker run --rm --privileged multiarch/qemu-user-static --reset -p yes + - docker buildx create --use + + # Build all of the platforms and cache the result + - bash docker_buildx + + # Using the multi-arch build cache + - bash docker_buildx --load + +script: + # Shellcheck main source files + - shellcheck -s bash start-zk.sh + - cd test + # Shellcheck the tests + - shellcheck -x -e SC1090 -s bash *.sh **/*.sh + - ./verifyImageLabels.sh # Verify docker image's label + # Add more tests in the future + +# This will deploy from master. Might want to have a single release branch for a little more control +deploy: + - provider: script + script: bash docker_push latest + on: + repo: wurstmeister/zookeeper-docker + branch: master + condition: $CURRENT = $LATEST + - provider: script + script: bash docker_push "${ZOOKEEPER_VERSION}" + on: + repo: wurstmeister/zookeeper-docker + # branch: release diff --git a/Dockerfile b/Dockerfile index 2ac723f..9283fad 100644 --- a/Dockerfile +++ b/Dockerfile @@ -1,34 +1,55 @@ -FROM wurstmeister/base - -MAINTAINER Wurstmeister - -ENV ZOOKEEPER_VERSION 3.4.13 - -#Download Zookeeper -RUN wget -q http://mirror.vorboss.net/apache/zookeeper/zookeeper-${ZOOKEEPER_VERSION}/zookeeper-${ZOOKEEPER_VERSION}.tar.gz && \ -wget -q https://www.apache.org/dist/zookeeper/KEYS && \ -wget -q https://www.apache.org/dist/zookeeper/zookeeper-${ZOOKEEPER_VERSION}/zookeeper-${ZOOKEEPER_VERSION}.tar.gz.asc && \ -wget -q https://www.apache.org/dist/zookeeper/zookeeper-${ZOOKEEPER_VERSION}/zookeeper-${ZOOKEEPER_VERSION}.tar.gz.md5 - -#Verify download -RUN md5sum -c zookeeper-${ZOOKEEPER_VERSION}.tar.gz.md5 && \ -gpg --import KEYS && \ -gpg --verify zookeeper-${ZOOKEEPER_VERSION}.tar.gz.asc - -#Install -RUN tar -xzf zookeeper-${ZOOKEEPER_VERSION}.tar.gz -C /opt - -#Configure -RUN mv /opt/zookeeper-${ZOOKEEPER_VERSION}/conf/zoo_sample.cfg /opt/zookeeper-${ZOOKEEPER_VERSION}/conf/zoo.cfg - -ENV JAVA_HOME /usr/lib/jvm/java-7-openjdk-amd64 -ENV ZK_HOME /opt/zookeeper-${ZOOKEEPER_VERSION} +ARG java_version=11-jre-slim + +FROM openjdk:${java_version} + +ARG zookeeper_version=3.7.0 +ARG vcs_ref=unspecified +ARG build_date=unspecified + +LABEL org.label-schema.name="zookeeper" \ + org.label-schema.description="Apache Zookeeper" \ + org.label-schema.build-date="${build_date}" \ + org.label-schema.vcs-url="https://github.com/wurstmeister/zookeeper-docker" \ + org.label-schema.vcs-ref="${vcs_ref}" \ + org.label-schema.version="${java_version}_${zookeeper_version}}" \ + org.label-schema.schema-version="1.0" \ + maintainer="wurstmeister" + +ENV ZOOKEEPER_VERSION=$zookeeper_version + +# Install deps +RUN apt-get update && apt-get install -y \ + wget \ + gnupg \ + ssh \ + && mkdir -p /run/sshd \ + && rm -rf /var/lib/apt/lists/* + +# Download Zookeeper +RUN wget -q https://mirror.vorboss.net/apache/zookeeper/zookeeper-${ZOOKEEPER_VERSION}/apache-zookeeper-${ZOOKEEPER_VERSION}-bin.tar.gz && \ + wget -q https://www.apache.org/dist/zookeeper/KEYS && \ + wget -q https://downloads.apache.org/zookeeper/zookeeper-${ZOOKEEPER_VERSION}/apache-zookeeper-${ZOOKEEPER_VERSION}-bin.tar.gz.asc && \ + wget -q https://downloads.apache.org/zookeeper/zookeeper-${ZOOKEEPER_VERSION}/apache-zookeeper-${ZOOKEEPER_VERSION}-bin.tar.gz.sha512 + +# Verify download +RUN sha512sum -c apache-zookeeper-${ZOOKEEPER_VERSION}-bin.tar.gz.sha512 && \ + gpg --import KEYS && \ + gpg --verify apache-zookeeper-${ZOOKEEPER_VERSION}-bin.tar.gz.asc + +# Install +RUN tar -xzf apache-zookeeper-${ZOOKEEPER_VERSION}-bin.tar.gz -C /opt && \ + mv /opt/apache-zookeeper-${ZOOKEEPER_VERSION}-bin /opt/zookeeper + +# Configure +RUN mv /opt/zookeeper/conf/zoo_sample.cfg /opt/zookeeper/conf/zoo.cfg + +ENV ZK_HOME /opt/zookeeper RUN sed -i "s|/tmp/zookeeper|$ZK_HOME/data|g" $ZK_HOME/conf/zoo.cfg; mkdir $ZK_HOME/data ADD start-zk.sh /usr/bin/start-zk.sh EXPOSE 2181 2888 3888 -WORKDIR /opt/zookeeper-${ZOOKEEPER_VERSION} -VOLUME ["/opt/zookeeper-${ZOOKEEPER_VERSION}/conf", "/opt/zookeeper-${ZOOKEEPER_VERSION}/data"] +WORKDIR /opt/zookeeper +VOLUME ["/opt/zookeeper/conf", "/opt/zookeeper/data"] CMD /usr/sbin/sshd && bash /usr/bin/start-zk.sh diff --git a/docker_buildx b/docker_buildx new file mode 100755 index 0000000..657a7ea --- /dev/null +++ b/docker_buildx @@ -0,0 +1,32 @@ +#!/bin/bash -e + +# Build for amd64 and arm64 +PLATFORMS="linux/amd64,linux/arm64" + +EXTRA_BUILDX_ARGS=$@ +CACHE_LOCATION="/tmp/docker-cache" + +if [[ "${EXTRA_BUILDX_ARGS}" == *"--load"* ]]; then + # We have to load the image for the current architecture only in order to run tests, so let's + # pull FROM the multi-arch build that happened previously + PLATFORMS="linux/${TRAVIS_CPU_ARCH}" + CACHE="--cache-from=type=local,src=${CACHE_LOCATION}" +elif [[ "${EXTRA_BUILDX_ARGS}" == *"--push"* ]]; then + # Push ALL architectures FROM the multi-arch build cache that happened previously + CACHE="--cache-from=type=local,src=${CACHE_LOCATION}" +else + # This is the multi-arch build that we should cache and use later + CACHE="--cache-to=type=local,dest=${CACHE_LOCATION}" +fi + +docker buildx build \ + $CACHE \ + --platform "${PLATFORMS}" \ + --progress=plain \ + --build-arg zookeeper_version=$ZOOKEEPER_VERSION \ + --build-arg java_version=$JAVA_VERSION \ + --build-arg vcs_ref=$TRAVIS_COMMIT \ + --build-arg build_date=$(date -u +"%Y-%m-%dT%H:%M:%SZ") \ + -t wurstmeister/zookeeper \ + $EXTRA_BUILDX_ARGS \ + . diff --git a/docker_push b/docker_push new file mode 100755 index 0000000..994f6ac --- /dev/null +++ b/docker_push @@ -0,0 +1,15 @@ +!/bin/bash -e + +BASE_IMAGE="wurstmeister/zookeeper" +IMAGE_VERSION="$1" + +if [ -z "$IMAGE_VERSION" ]; then + echo "No IMAGE_VERSION var specified" + exit 1 +fi + +echo "$DOCKER_PASSWORD" | docker login -u "$DOCKER_USERNAME" --password-stdin +TARGET="$BASE_IMAGE:$IMAGE_VERSION" +bash docker_buildx \ + -t "$TARGET" \ + --push diff --git a/start-zk.sh b/start-zk.sh index df6ad64..4d3e69a 100755 --- a/start-zk.sh +++ b/start-zk.sh @@ -1,4 +1,4 @@ sed -i -r 's|#(log4j.appender.ROLLINGFILE.MaxBackupIndex.*)|\1|g' $ZK_HOME/conf/log4j.properties sed -i -r 's|#autopurge|autopurge|g' $ZK_HOME/conf/zoo.cfg -/opt/zookeeper-3.4.13/bin/zkServer.sh start-foreground +/opt/zookeeper/bin/zkServer.sh start-foreground diff --git a/test/verifyImageLabels.sh b/test/verifyImageLabels.sh new file mode 100755 index 0000000..0ef762b --- /dev/null +++ b/test/verifyImageLabels.sh @@ -0,0 +1,21 @@ + +#!/bin/bash -e + +VCS_REF=$(docker inspect -f '{{ index .Config.Labels "org.label-schema.vcs-ref"}}' wurstmeister/zookeeper) +echo "VCS_REF=$VCS_REF" +if [ -z "$VCS_REF" ] || [ "$VCS_REF" = "unspecified" ]; then + echo "org.label-schema.vcs-ref is empty or unspecified" + exit 1 +fi +if ! git cat-file -e "$VCS_REF^{commit}"; then + echo "$VCS_REF Not a valid git commit" + exit 1 +fi + +BUILD_DATE=$(docker inspect -f '{{ index .Config.Labels "org.label-schema.build-date"}}' wurstmeister/zookeeper) +echo "BUILD_DATE=$BUILD_DATE" +if ! date -d "$BUILD_DATE"; then + echo "$BUILD_DATE Not a valid date" + exit 1 +fi +exit 0