mkimage-rinse.sh 3.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112
  1. #!/bin/bash
  2. set -e
  3. repo="$1"
  4. distro="$2"
  5. mirror="$3"
  6. if [ ! "$repo" ] || [ ! "$distro" ]; then
  7. self="$(basename $0)"
  8. echo >&2 "usage: $self repo distro [mirror]"
  9. echo >&2
  10. echo >&2 " ie: $self username/centos centos-5"
  11. echo >&2 " $self username/centos centos-6"
  12. echo >&2
  13. echo >&2 " ie: $self username/slc slc-5"
  14. echo >&2 " $self username/slc slc-6"
  15. echo >&2
  16. echo >&2 " ie: $self username/centos centos-5 http://vault.centos.org/5.8/os/x86_64/CentOS/"
  17. echo >&2 " $self username/centos centos-6 http://vault.centos.org/6.3/os/x86_64/Packages/"
  18. echo >&2
  19. echo >&2 'See /etc/rinse for supported values of "distro" and for examples of'
  20. echo >&2 ' expected values of "mirror".'
  21. echo >&2
  22. echo >&2 'This script is tested to work with the original upstream version of rinse,'
  23. echo >&2 ' found at http://www.steve.org.uk/Software/rinse/ and also in Debian at'
  24. echo >&2 ' http://packages.debian.org/wheezy/rinse -- as always, YMMV.'
  25. echo >&2
  26. exit 1
  27. fi
  28. target="/tmp/docker-rootfs-rinse-$distro-$$-$RANDOM"
  29. cd "$(dirname "$(readlink -f "$BASH_SOURCE")")"
  30. returnTo="$(pwd -P)"
  31. rinseArgs=( --arch amd64 --distribution "$distro" --directory "$target" )
  32. if [ "$mirror" ]; then
  33. rinseArgs+=( --mirror "$mirror" )
  34. fi
  35. set -x
  36. mkdir -p "$target"
  37. sudo rinse "${rinseArgs[@]}"
  38. cd "$target"
  39. # rinse fails a little at setting up /dev, so we'll just wipe it out and create our own
  40. sudo rm -rf dev
  41. sudo mkdir -m 755 dev
  42. (
  43. cd dev
  44. sudo ln -sf /proc/self/fd ./
  45. sudo mkdir -m 755 pts
  46. sudo mkdir -m 1777 shm
  47. sudo mknod -m 600 console c 5 1
  48. sudo mknod -m 600 initctl p
  49. sudo mknod -m 666 full c 1 7
  50. sudo mknod -m 666 null c 1 3
  51. sudo mknod -m 666 ptmx c 5 2
  52. sudo mknod -m 666 random c 1 8
  53. sudo mknod -m 666 tty c 5 0
  54. sudo mknod -m 666 tty0 c 4 0
  55. sudo mknod -m 666 urandom c 1 9
  56. sudo mknod -m 666 zero c 1 5
  57. )
  58. # effectively: febootstrap-minimize --keep-zoneinfo --keep-rpmdb --keep-services "$target"
  59. # locales
  60. sudo rm -rf usr/{{lib,share}/locale,{lib,lib64}/gconv,bin/localedef,sbin/build-locale-archive}
  61. # docs
  62. sudo rm -rf usr/share/{man,doc,info,gnome/help}
  63. # cracklib
  64. sudo rm -rf usr/share/cracklib
  65. # i18n
  66. sudo rm -rf usr/share/i18n
  67. # yum cache
  68. sudo rm -rf var/cache/yum
  69. sudo mkdir -p --mode=0755 var/cache/yum
  70. # sln
  71. sudo rm -rf sbin/sln
  72. # ldconfig
  73. #sudo rm -rf sbin/ldconfig
  74. sudo rm -rf etc/ld.so.cache var/cache/ldconfig
  75. sudo mkdir -p --mode=0755 var/cache/ldconfig
  76. # allow networking init scripts inside the container to work without extra steps
  77. echo 'NETWORKING=yes' | sudo tee etc/sysconfig/network > /dev/null
  78. # to restore locales later:
  79. # yum reinstall glibc-common
  80. version=
  81. if [ -r etc/redhat-release ]; then
  82. version="$(sed -E 's/^[^0-9.]*([0-9.]+).*$/\1/' etc/redhat-release)"
  83. elif [ -r etc/SuSE-release ]; then
  84. version="$(awk '/^VERSION/ { print $3 }' etc/SuSE-release)"
  85. fi
  86. if [ -z "$version" ]; then
  87. echo >&2 "warning: cannot autodetect OS version, using $distro as tag"
  88. sleep 20
  89. version="$distro"
  90. fi
  91. sudo tar --numeric-owner -c . | docker import - $repo:$version
  92. docker run -i -t $repo:$version echo success
  93. cd "$returnTo"
  94. sudo rm -rf "$target"