github.com/zhuohuang-hust/src-cbuild@v0.0.0-20230105071821-c7aab3e7c840/contrib/docker-machine-install-bundle.sh (about)

     1  #!/bin/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 docker-containerd docker-containerd-ctr docker-containerd-shim docker-init docker-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; op=$2
    46      # NOTE: `docker-machine ssh $m sh -c "foo bar"` does not work
    47      #       (but `docker-machine ssh $m sh -c "foo\ bar"` works)
    48      #       Anyway we avoid using `sh -c` here for avoiding confusion
    49      cat <<EOF | docker-machine ssh $m sudo sh
    50  if command -v systemctl > /dev/null; then
    51    systemctl $op docker
    52  elif command -v service > /dev/null; then
    53    service docker $op
    54  elif [ -x /etc/init.d/docker ]; then
    55    /etc/init.d/docker $op
    56  else
    57    echo "not sure how to control the docker daemon"
    58    exit 1
    59  fi
    60  EOF
    61  }
    62  
    63  detect_prefix(){
    64      m=$1
    65      script='dirname $(dirname $(which dockerd))'
    66      echo $script | docker-machine ssh $m sh
    67  }
    68  
    69  install_to(){
    70      m=$1; shift; files=$@
    71      echo "$m: detecting docker"
    72      prefix=$(detect_prefix $m)
    73      echo "$m: detected docker on $prefix"
    74      echo "$m: stopping docker"
    75      control_docker $m stop
    76      echo "$m: installing docker"
    77      # NOTE: GNU tar is required because we use --transform here
    78      # TODO: compression (should not be default)
    79      tar ch --transform 's/.*\///' $files | docker-machine ssh $m sudo tar Cx $prefix/bin
    80      echo "$m: starting docker"
    81      control_docker $m start
    82      echo "$m: done"
    83  }
    84  
    85  check_prereq(){
    86      command -v docker-machine > /dev/null || errexit "docker-machine not installed"
    87      ( tar --version | grep GNU > /dev/null ) || errexit "GNU tar not installed"
    88  }
    89  
    90  case "$1" in
    91      "install")
    92  	shift; machines=$@
    93  	check_prereq
    94  	files=$(bundle_files)
    95  	echo "Files to be installed:"
    96  	for f in $files; do echo $f; done
    97  	pids=()
    98  	for m in $machines; do
    99  	    install_to $m $files &
   100  	    pids+=($!)
   101  	done
   102  	status=0
   103  	for pid in ${pids[@]}; do
   104  	    wait $pid || { status=$?; echo "background process $pid failed with exit status $status"; }
   105  	done
   106  	exit $status
   107  	;;
   108      *)
   109  	errexit "Usage: $0 install MACHINES"
   110  	;;
   111  esac