| #!/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 |