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