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