blob: ab8f7754652cd787d408cc584af5d96ca4f1b8fa [file] [log] [blame]
#!/usr/bin/env bash
# Licensed to the Apache Software Foundation (ASF) under one
# or more contributor license agreements. See the NOTICE file
# distributed with this work for additional information
# regarding copyright ownership. The ASF licenses this file
# to you under the Apache License, Version 2.0 (the
# "License"); you may not use this file except in compliance
# with the License. You may obtain a copy of the License at
#
# http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing,
# software distributed under the License is distributed on an
# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
# KIND, either express or implied. See the License for the
# specific language governing permissions and limitations
# under the License.
# This shell script makes it easier to build multi-platform
# architecture Docker containers on an x86_64 host.
#
# For more reading:
# https://github.com/moby/buildkit/issues/1943
# https://github.com/tonistiigi/binfmt
# https://github.com/multiarch/qemu-user-static
# https://lobradov.github.io/Building-docker-multiarch-images/
# https://github.com/jessfraz/irssi/blob/master/.travis.yml
# https://engineering.docker.com/2019/04/multi-arch-images/
# https://github.com/docker/buildx
set -e
BUILDX_PLATFORMS="linux/amd64,linux/arm64/v8,linux/s390x"
# Temporarily disable ppc64le because https://github.com/apache/couchdb-pkg/commit/365d07ce43d9d6d9c3377dd08dc8fc5f656a11bf
clean() {
echo $#
if [ $# -eq 0 ]
then
regex="*"
elif [ $# -eq 1 ]
then
regex=$1
else
usage
fi
docker images --filter=reference="apache/couchdb:${regex}" | tr -s ' ' | cut -d ' ' -f 2 | while read tag
do
if [ ${tag} ] && [ ${tag} = "TAG" ]
then
continue
fi
docker rmi apache/couchdb:$tag
done
}
# Builds all platforms for a specific version and pushes to the registry
buildx() {
if [ $2 ]
then
tag_as=$2
else
tag_as=$1
fi
echo "Starting buildx build at $(date)..."
docker buildx build --platform ${BUILDX_PLATFORMS} --tag apache/couchdb:$tag_as --push $1
echo ""
echo "Starting buildx nouveau build at $(date)..."
docker buildx build --platform ${BUILDX_PLATFORMS} --tag apache/couchdb:${tag_as}-nouveau --push $1-nouveau
echo ""
}
usage() {
cat << EOF
$0 <command> <-f> <-n> [OPTIONS]
General commands:
clean Removes ALL local apache/couchdb images (!!)
clean <regex> Removes ALL local images with matching tags.
\`docker buildx\` commands:
buildx #.#.# Builds *and pushes* all platforms for supplied
version, using docker buildx. Built images must
be retrieved with \`docker pull\` for local use.
buildx #.#.# as <tag>
Builds and pushes all platforms for supplied
version, using docker buildx, tagging the
manifest with the supplied <tag>.
Example workflow:
$0 clean *2.9.7*
$0 buildx 2.9.7
$0 buildx 2.9.7 as 2.9
$0 buildx 2.9.7 as 2
$0 buildx 2.9.7 as latest
docker manifest inspect apache/couchdb:2.9.7
docker pull <--platform linux/other-arch> apache/couchdb:2.9.7 (for testing)
EOF
exit 0
}
# #######################
# handle -f/-n anywhere they appear on the CLI
POSITIONAL=()
while [[ $# -gt 0 ]]
do
# otherwise, we WILL match a regex against top-level directories!
set -f
key="$1"
case $key in
*)
POSITIONAL+=("$1")
shift
;;
esac
set +f
done
# re-set all other arguments into argc
set -- "${POSITIONAL[@]}" # restore positional parameters
case "$1" in
clean)
# removes local images for a given version (and optionally platform)
shift
set -f
clean $*
set +f
;;
buildx)
# builds and pushes using docker buildx
shift
if [ $# -ne 1 -a $# -ne 3 ]
then
usage
fi
if [ $# -eq 1 ]
then
buildx $1
elif [ $2 = "as" ]
then
buildx $1 $3
else
usage
fi
;;
usage)
usage
;;
*)
usage
;;
esac