#!/usr/bin/env bash # # This script installs the bundle to Docker Machine instances, for the purpose # of testing the latest Docker with Swarm mode enabled. # Do not use in production. # # Requirements (on host to run this script) # - bash is installed # - Docker Machine is installed # - GNU tar is installed # # Requirements (on Docker machine instances) # - Docker can be managed via one of `systemctl`, `service`, or `/etc/init.d/docker` # set -e set -o pipefail errexit() { echo "$1" exit 1 } BUNDLE="bundles/$(cat VERSION)" bundle_files(){ # prefer dynbinary if exists for f in dockerd docker-proxy; do if [ -d $BUNDLE/dynbinary-daemon ]; then echo $BUNDLE/dynbinary-daemon/$f else echo $BUNDLE/binary-daemon/$f fi done for f in containerd ctr containerd-shim docker-init runc; do echo $BUNDLE/binary-daemon/$f done if [ -d $BUNDLE/dynbinary-client ]; then echo $BUNDLE/dynbinary-client/docker else echo $BUNDLE/binary-client/docker fi } control_docker(){ m=$1; op=$2 # NOTE: `docker-machine ssh $m sh -c "foo bar"` does not work # (but `docker-machine ssh $m sh -c "foo\ bar"` works) # Anyway we avoid using `sh -c` here for avoiding confusion cat < /dev/null; then systemctl $op docker elif command -v service > /dev/null; then service docker $op elif [ -x /etc/init.d/docker ]; then /etc/init.d/docker $op else echo "not sure how to control the docker daemon" exit 1 fi EOF } detect_prefix(){ m=$1 script='dirname $(dirname $(which dockerd))' echo $script | docker-machine ssh $m sh } install_to(){ m=$1; shift; files=$@ echo "$m: detecting docker" prefix=$(detect_prefix $m) echo "$m: detected docker on $prefix" echo "$m: stopping docker" control_docker $m stop echo "$m: installing docker" # NOTE: GNU tar is required because we use --transform here # TODO: compression (should not be default) tar ch --transform 's/.*\///' $files | docker-machine ssh $m sudo tar Cx $prefix/bin echo "$m: starting docker" control_docker $m start echo "$m: done" } check_prereq(){ command -v docker-machine > /dev/null || errexit "docker-machine not installed" ( tar --version | grep GNU > /dev/null ) || errexit "GNU tar not installed" } case "$1" in "install") shift; machines=$@ check_prereq files=$(bundle_files) echo "Files to be installed:" for f in $files; do echo $f; done pids=() for m in $machines; do install_to $m $files & pids+=($!) done status=0 for pid in ${pids[@]}; do wait $pid || { status=$?; echo "background process $pid failed with exit status $status"; } done exit $status ;; *) errexit "Usage: $0 install MACHINES" ;; esac