#!/bin/sh # Originally from: # https://github.com/docker/docker/blob/master/contrib/mkimage-alpine.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] [-i image]\n' "$0" exit 1 } tmp() { TMP=$(mktemp -d ${TMPDIR:-/var/tmp}/alpine-docker-XXXXXXXXXX) ROOTFS=$(mktemp -d ${TMPDIR:-/var/tmp}/alpine-docker-rootfs-XXXXXXXXXX) # This needs to be done or overlayfs won't be happy with our imported image. chmod 755 $ROOTFS 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 --update-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 - $IMAGE) docker run -i --rm $IMAGE printf '%s with id=%s created!\n' $IMAGE $id } save() { [ $SAVE -eq 1 ] || return 0 tar --numeric-owner -C $ROOTFS -c . | xz > rootfs.tar.xz } while getopts "hr:m:si:" opt; do case $opt in r) REL=$OPTARG ;; m) MIRROR=$OPTARG ;; s) SAVE=1 ;; i) IMAGE=$OPTARG ;; *) usage ;; esac done REL=${REL:-edge} MIRROR=${MIRROR:-http://nl.alpinelinux.org/alpine} SAVE=${SAVE:-0} MAINREPO=$MIRROR/$REL/main ADDITIONALREPO=$MIRROR/$REL/community ARCH=${ARCH:-$(uname -m)} IMAGE=${IMAGE:-alpine:$REL} tmp getapk mkbase conf pack save