kolla-ansible/tools/build-docker-image
Martin André f370edfb70 Add retry parameter to build-docker-image
Partial-Bug: #1466677
Change-Id: I2fc2ded47bb2ed34fb1e272d35b0758f098ce0ac
2015-06-25 11:59:02 +09:00

179 lines
3.8 KiB
Bash
Executable File

#!/bin/bash
if [[ $EUID -eq 0 ]]; then
echo "This script must not be run as root. Instead add yourself to the docker group." 1>&2
exit 1
fi
TOPDIR=$(git rev-parse --show-toplevel)
IMGDIR="$(cd "$(dirname "$0")" && pwd)"
RELEASE_NAMESPACE=kollaglue
NAMESPACE=kollaglue
PREFIX=centos-rdo-
TAG=$(git rev-parse --short HEAD)
RELEASE_TAG=latest
MAX_TRIES=1
usage () {
cat <<EOF
Usage: $0 [options]
Options:
--prefix <image_prefix>
--private-registry, -r <registry_address[:port]>
--namespace, -n <namespace>
--tag, -t <tag>
--push, -p
--force-rm, -f
--no-cache, -N
--pull, -u
--release
--no-use-released-parent
--retry <number_of_retries>
EOF
}
[ -f $TOPDIR/.buildconf ] && . $TOPDIR/.buildconf
[ -f $IMGDIR/.buildconf ] && . $IMGDIR/.buildconf
ARGS=$(getopt -o hr:n:t:pfuN -l help,prefix:,namespace:,push,pull,private-registry:,release,tag:,force-rm,no-cache,no-use-released-parent,retry: -- "$@") || { usage >&2; exit 2; }
eval set -- "$ARGS"
while :; do
case "$1" in
(--help|-h) usage
exit 0
;;
(--prefix) shift
FORCE_PREFIX="$1"
;;
(--release) MODE=release
NAMESPACE=$RELEASE_NAMESPACE
TAG=$RELEASE_TAG
;;
(--tag|-t) shift
TAG="$1"
;;
(--push|-p) PUSH=1
;;
(--pull|-u) BUILDFLAGS="${BUILDFLAGS} --pull=true"
;;
(--force-rm|-f)
BUILDFLAGS="${BUILDFLAGS} --force-rm=true"
;;
(--no-cache|-N)
BUILDFLAGS="${BUILDFLAGS} --no-cache"
;;
(--private-registry|-r)
shift
REGISTRY="$1"
;;
(--namespace|-n)
shift
NAMESPACE="$1"
;;
(--no-use-released-parent)
USE_CURRENT_TAG=1
;;
(--retry)
shift
MAX_TRIES=$((MAX_TRIES + $1))
;;
(--) break
;;
esac
shift
done
if [[ $USE_CURRENT_TAG = 1 ]]; then
PARENT_TAG=$TAG
else
PARENT_TAG=$RELEASE_TAG
fi
if [ "$NAMESPACE" = "$RELEASE_NAMESPACE" ] \
&& [ "$TAG" = "$RELEASE_TAG" ] \
&& ! [ "$MODE" = "release" ]; then
echo "ERROR: use --release to build a release image" >&2
exit 1
fi
if [[ -n "${PREFIX}" && -n "${FORCE_PREFIX}" ]]; then
PREFIX="${FORCE_PREFIX}"
fi
if [[ -n $REGISTRY ]]; then
NAMESPACE="${REGISTRY}/${NAMESPACE}"
fi
IMAGE="${PREFIX}${IMGDIR##*/}"
FULLIMAGE="${NAMESPACE}/${IMAGE}${TAG:+:${TAG}}"
cat <<EOF
======================================================================
$FULLIMAGE
======================================================================
EOF
if [ "$MODE" = "release" ]; then
echo "*** YOU ARE BUILDING A RELEASE IMAGE ***"
echo
fi
TMPDIR=$(mktemp -d /tmp/kolla-build.XXXXXXXXXX)
cp -aL $IMGDIR/* $TMPDIR
# Use an extension for in-place editing for portability, as GNU and BSD
# versions of sed behave differently otherwise
sed -i.bak "s|%%KOLLA_NAMESPACE%%|${NAMESPACE}|g" $TMPDIR/Dockerfile
sed -i.bak "s|%%KOLLA_PREFIX%%|${PREFIX}|g" $TMPDIR/Dockerfile
sed -i.bak "s|%%KOLLA_TAG%%|${PARENT_TAG}|g" $TMPDIR/Dockerfile
TRY=0
while [ $((MAX_TRIES - 1)) -gt $TRY ]; do
if docker build ${BUILDFLAGS} -t "$FULLIMAGE" $TMPDIR; then
break
else
echo "WARNING: failed to build $FULLIMAGE, retrying..."
TRY=$((TRY + 1))
fi
done
if ! docker build ${BUILDFLAGS} -t "$FULLIMAGE" $TMPDIR; then
echo "ERROR: failed to build $FULLIMAGE"
exit 1
fi
rm -rf $TMPDIR
echo "Built: $FULLIMAGE"
if [ "$PUSH" = 1 ]; then
if ! docker push "$FULLIMAGE"; then
echo "ERROR: failed to push $FULLIMAGE"
exit 1
fi
echo "Pushed: $FULLIMAGE"
fi