Skip to content
Snippets Groups Projects
build-docker-image 3.8 KiB
Newer Older
  • Learn to ignore specific revisions
  • TOPDIR=$(git rev-parse --show-toplevel)
    
    IMGDIR="$(cd "$(dirname "$0")" && pwd)"
    
    . $TOPDIR/tools/validate-docker-execute
    
    
    RELEASE_NAMESPACE=kollaglue
    
    NAMESPACE=kollaglue
    
    PREFIX=centos-rdo-
    
    TAG=$(git rev-parse --short HEAD)
    
    
    usage () {
        cat <<EOF
    
    Usage: $0 [options]
    
    --prefix <image_prefix>
    
    --private-registry, -r <registry_address[:port]>
    
    --namespace, -n <namespace>
    --tag, -t <tag>
    --push, -p
    
    --no-cache, -N
    
    --no-use-released-parent
    
    --retry <number_of_retries>
    
    EOF
    }
    
    [ -f $TOPDIR/.buildconf ] && . $TOPDIR/.buildconf
    
    [ -f $IMGDIR/.buildinfo ] && . $IMGDIR/.buildinfo
    
    [ -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
    
        (--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))
                    ;;
    
    
    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
    
    Martin André's avatar
    Martin André committed
    # 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
    
    if [[ "${SOURCE_INSTALL_AVAILABLE}" == "1" ]]; then
        . ${TOPDIR}/tools/gen-source-tar.sh
    fi
    
    
    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