| #!/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 <<EOF | docker-machine ssh $m sudo sh |
| if command -v systemctl > /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 |