mkimage-alpine.sh 1.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687
  1. #!/bin/sh
  2. set -e
  3. [ $(id -u) -eq 0 ] || {
  4. printf >&2 '%s requires root\n' "$0"
  5. exit 1
  6. }
  7. usage() {
  8. printf >&2 '%s: [-r release] [-m mirror] [-s] [-c additional repository]\n' "$0"
  9. exit 1
  10. }
  11. tmp() {
  12. TMP=$(mktemp -d ${TMPDIR:-/var/tmp}/alpine-docker-XXXXXXXXXX)
  13. ROOTFS=$(mktemp -d ${TMPDIR:-/var/tmp}/alpine-docker-rootfs-XXXXXXXXXX)
  14. trap "rm -rf $TMP $ROOTFS" EXIT TERM INT
  15. }
  16. apkv() {
  17. curl -sSL $MAINREPO/$ARCH/APKINDEX.tar.gz | tar -Oxz |
  18. grep --text '^P:apk-tools-static$' -A1 | tail -n1 | cut -d: -f2
  19. }
  20. getapk() {
  21. curl -sSL $MAINREPO/$ARCH/apk-tools-static-$(apkv).apk |
  22. tar -xz -C $TMP sbin/apk.static
  23. }
  24. mkbase() {
  25. $TMP/sbin/apk.static --repository $MAINREPO --update-cache --allow-untrusted \
  26. --root $ROOTFS --initdb add alpine-base
  27. }
  28. conf() {
  29. printf '%s\n' $MAINREPO > $ROOTFS/etc/apk/repositories
  30. printf '%s\n' $ADDITIONALREPO >> $ROOTFS/etc/apk/repositories
  31. }
  32. pack() {
  33. local id
  34. id=$(tar --numeric-owner -C $ROOTFS -c . | docker import - alpine:$REL)
  35. docker tag $id alpine:latest
  36. docker run -i -t --rm alpine printf 'alpine:%s with id=%s created!\n' $REL $id
  37. }
  38. save() {
  39. [ $SAVE -eq 1 ] || return
  40. tar --numeric-owner -C $ROOTFS -c . | xz > rootfs.tar.xz
  41. }
  42. while getopts "hr:m:s" opt; do
  43. case $opt in
  44. r)
  45. REL=$OPTARG
  46. ;;
  47. m)
  48. MIRROR=$OPTARG
  49. ;;
  50. s)
  51. SAVE=1
  52. ;;
  53. c)
  54. ADDITIONALREPO=community
  55. ;;
  56. *)
  57. usage
  58. ;;
  59. esac
  60. done
  61. REL=${REL:-edge}
  62. MIRROR=${MIRROR:-http://nl.alpinelinux.org/alpine}
  63. SAVE=${SAVE:-0}
  64. MAINREPO=$MIRROR/$REL/main
  65. ADDITIONALREPO=$MIRROR/$REL/community
  66. ARCH=${ARCH:-$(uname -m)}
  67. tmp
  68. getapk
  69. mkbase
  70. conf
  71. pack
  72. save