docker-machine-install-bundle.sh 2.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111
  1. #!/usr/bin/env bash
  2. #
  3. # This script installs the bundle to Docker Machine instances, for the purpose
  4. # of testing the latest Docker with Swarm mode enabled.
  5. # Do not use in production.
  6. #
  7. # Requirements (on host to run this script)
  8. # - bash is installed
  9. # - Docker Machine is installed
  10. # - GNU tar is installed
  11. #
  12. # Requirements (on Docker machine instances)
  13. # - Docker can be managed via one of `systemctl`, `service`, or `/etc/init.d/docker`
  14. #
  15. set -e
  16. set -o pipefail
  17. errexit() {
  18. echo "$1"
  19. exit 1
  20. }
  21. BUNDLE="bundles/$(cat VERSION)"
  22. bundle_files(){
  23. # prefer dynbinary if exists
  24. for f in dockerd docker-proxy; do
  25. if [ -d $BUNDLE/dynbinary-daemon ]; then
  26. echo $BUNDLE/dynbinary-daemon/$f
  27. else
  28. echo $BUNDLE/binary-daemon/$f
  29. fi
  30. done
  31. for f in docker-containerd docker-containerd-ctr docker-containerd-shim docker-init docker-runc; do
  32. echo $BUNDLE/binary-daemon/$f
  33. done
  34. if [ -d $BUNDLE/dynbinary-client ]; then
  35. echo $BUNDLE/dynbinary-client/docker
  36. else
  37. echo $BUNDLE/binary-client/docker
  38. fi
  39. }
  40. control_docker(){
  41. m=$1; op=$2
  42. # NOTE: `docker-machine ssh $m sh -c "foo bar"` does not work
  43. # (but `docker-machine ssh $m sh -c "foo\ bar"` works)
  44. # Anyway we avoid using `sh -c` here for avoiding confusion
  45. cat <<EOF | docker-machine ssh $m sudo sh
  46. if command -v systemctl > /dev/null; then
  47. systemctl $op docker
  48. elif command -v service > /dev/null; then
  49. service docker $op
  50. elif [ -x /etc/init.d/docker ]; then
  51. /etc/init.d/docker $op
  52. else
  53. echo "not sure how to control the docker daemon"
  54. exit 1
  55. fi
  56. EOF
  57. }
  58. detect_prefix(){
  59. m=$1
  60. script='dirname $(dirname $(which dockerd))'
  61. echo $script | docker-machine ssh $m sh
  62. }
  63. install_to(){
  64. m=$1; shift; files=$@
  65. echo "$m: detecting docker"
  66. prefix=$(detect_prefix $m)
  67. echo "$m: detected docker on $prefix"
  68. echo "$m: stopping docker"
  69. control_docker $m stop
  70. echo "$m: installing docker"
  71. # NOTE: GNU tar is required because we use --transform here
  72. # TODO: compression (should not be default)
  73. tar ch --transform 's/.*\///' $files | docker-machine ssh $m sudo tar Cx $prefix/bin
  74. echo "$m: starting docker"
  75. control_docker $m start
  76. echo "$m: done"
  77. }
  78. check_prereq(){
  79. command -v docker-machine > /dev/null || errexit "docker-machine not installed"
  80. ( tar --version | grep GNU > /dev/null ) || errexit "GNU tar not installed"
  81. }
  82. case "$1" in
  83. "install")
  84. shift; machines=$@
  85. check_prereq
  86. files=$(bundle_files)
  87. echo "Files to be installed:"
  88. for f in $files; do echo $f; done
  89. pids=()
  90. for m in $machines; do
  91. install_to $m $files &
  92. pids+=($!)
  93. done
  94. status=0
  95. for pid in ${pids[@]}; do
  96. wait $pid || { status=$?; echo "background process $pid failed with exit status $status"; }
  97. done
  98. exit $status
  99. ;;
  100. *)
  101. errexit "Usage: $0 install MACHINES"
  102. ;;
  103. esac