mkimage-alpine.sh 1.3 KB

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