dotcloud/docker

View on GitHub
contrib/mkimage-alpine.sh

Summary

Maintainability
Test Coverage
#!/bin/sh

set -e

[ $(id -u) -eq 0 ] || {
    printf >&2 '%s requires root\n' "$0"
    exit 1
}

usage() {
    printf >&2 '%s: [-r release] [-m mirror] [-s] [-c additional repository] [-a arch]\n' "$0"
    exit 1
}

tmp() {
    TMP=$(mktemp -d ${TMPDIR:-/var/tmp}/alpine-docker-XXXXXXXXXX)
    ROOTFS=$(mktemp -d ${TMPDIR:-/var/tmp}/alpine-docker-rootfs-XXXXXXXXXX)
    trap "rm -rf $TMP $ROOTFS" EXIT TERM INT
}

apkv() {
    curl -sSL $MAINREPO/$ARCH/APKINDEX.tar.gz | tar -Oxz \
        | grep --text '^P:apk-tools-static$' -A1 | tail -n1 | cut -d: -f2
}

getapk() {
    curl -sSL $MAINREPO/$ARCH/apk-tools-static-$(apkv).apk \
        | tar -xz -C $TMP sbin/apk.static
}

mkbase() {
    $TMP/sbin/apk.static --repository $MAINREPO --no-cache --allow-untrusted \
        --root $ROOTFS --initdb add alpine-base
}

conf() {
    printf '%s\n' $MAINREPO > $ROOTFS/etc/apk/repositories
    printf '%s\n' $ADDITIONALREPO >> $ROOTFS/etc/apk/repositories
}

pack() {
    local id
    id=$(tar --numeric-owner -C $ROOTFS -c . | docker import - alpine:$REL)

    docker tag $id alpine:latest
    docker run --rm alpine printf 'alpine:%s with id=%s created!\n' $REL $id
}

save() {
    [ $SAVE -eq 1 ] || return 0

    tar --numeric-owner -C $ROOTFS -c . | xz > rootfs.tar.xz
}

while getopts "hr:m:sc:a:" opt; do
    case $opt in
        r)
            REL=$OPTARG
            ;;
        m)
            MIRROR=$OPTARG
            ;;
        s)
            SAVE=1
            ;;
        c)
            ADDITIONALREPO=$OPTARG
            ;;
        a)
            ARCH=$OPTARG
            ;;
        *)
            usage
            ;;
    esac
done

REL=${REL:-edge}
MIRROR=${MIRROR:-http://nl.alpinelinux.org/alpine}
SAVE=${SAVE:-0}
MAINREPO=$MIRROR/$REL/main
ADDITIONALREPO=$MIRROR/$REL/${ADDITIONALREPO:-community}
ARCH=${ARCH:-$(uname -m)}

tmp
getapk
mkbase
conf
pack
save