github.com/docker/docker@v299999999.0.0-20200612211812-aaf470eca7b5+incompatible/contrib/docker-machine-install-bundle.sh (about) 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 18 errexit() { 19 echo "$1" 20 exit 1 21 } 22 23 BUNDLE="bundles/$(cat VERSION)" 24 25 bundle_files() { 26 # prefer dynbinary if exists 27 for f in dockerd docker-proxy; do 28 if [ -d $BUNDLE/dynbinary-daemon ]; then 29 echo $BUNDLE/dynbinary-daemon/$f 30 else 31 echo $BUNDLE/binary-daemon/$f 32 fi 33 done 34 for f in containerd ctr containerd-shim docker-init runc; do 35 echo $BUNDLE/binary-daemon/$f 36 done 37 if [ -d $BUNDLE/dynbinary-client ]; then 38 echo $BUNDLE/dynbinary-client/docker 39 else 40 echo $BUNDLE/binary-client/docker 41 fi 42 } 43 44 control_docker() { 45 m=$1 46 op=$2 47 # NOTE: `docker-machine ssh $m sh -c "foo bar"` does not work 48 # (but `docker-machine ssh $m sh -c "foo\ bar"` works) 49 # Anyway we avoid using `sh -c` here for avoiding confusion 50 cat << EOF | docker-machine ssh $m sudo sh 51 if command -v systemctl > /dev/null; then 52 systemctl $op docker 53 elif command -v service > /dev/null; then 54 service docker $op 55 elif [ -x /etc/init.d/docker ]; then 56 /etc/init.d/docker $op 57 else 58 echo "not sure how to control the docker daemon" 59 exit 1 60 fi 61 EOF 62 } 63 64 detect_prefix() { 65 m=$1 66 script='dirname $(dirname $(which dockerd))' 67 echo $script | docker-machine ssh $m sh 68 } 69 70 install_to() { 71 m=$1 72 shift 73 files=$@ 74 echo "$m: detecting docker" 75 prefix=$(detect_prefix $m) 76 echo "$m: detected docker on $prefix" 77 echo "$m: stopping docker" 78 control_docker $m stop 79 echo "$m: installing docker" 80 # NOTE: GNU tar is required because we use --transform here 81 # TODO: compression (should not be default) 82 tar ch --transform 's/.*\///' $files | docker-machine ssh $m sudo tar Cx $prefix/bin 83 echo "$m: starting docker" 84 control_docker $m start 85 echo "$m: done" 86 } 87 88 check_prereq() { 89 command -v docker-machine > /dev/null || errexit "docker-machine not installed" 90 (tar --version | grep GNU > /dev/null) || errexit "GNU tar not installed" 91 } 92 93 case "$1" in 94 "install") 95 shift 96 machines=$@ 97 check_prereq 98 files=$(bundle_files) 99 echo "Files to be installed:" 100 for f in $files; do echo $f; done 101 pids=() 102 for m in $machines; do 103 install_to $m $files & 104 pids+=($!) 105 done 106 status=0 107 for pid in ${pids[@]}; do 108 wait $pid || { 109 status=$? 110 echo "background process $pid failed with exit status $status" 111 } 112 done 113 exit $status 114 ;; 115 *) 116 errexit "Usage: $0 install MACHINES" 117 ;; 118 esac