moby/contrib/docker-machine-install-bundle.sh
Akihiro Suda 3cf82748dd run shfmt
git grep --name-only '^#!' | egrep -v '(vendor|\.go|Jenkinsfile)' | xargs shfmt -w -bn -ci -sr

Signed-off-by: Akihiro Suda <akihiro.suda.cz@hco.ntt.co.jp>
2020-03-03 12:27:49 +09:00

118 lines
2.7 KiB
Bash
Executable file

#!/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