Browse code

contrib: add docker-machine-install-bundle.sh

docker-machine-install-bundle.sh installs the bundle to Docker Machine instances.

This script helps developers to test the latest Docker with Swarm-mode enabled.

Usage:

$ docker-machine create -d some-driver dm01
..
$ docker-machine create -d some-driver dm05
$ make binary
$ contrib/docker-machine-install-bundle.sh install dm01 dm02 dm03 dm04 dm05

Signed-off-by: Akihiro Suda <suda.akihiro@lab.ntt.co.jp>

Akihiro Suda authored on 2016/10/21 13:33:59
Showing 1 changed files
1 1
new file mode 100755
... ...
@@ -0,0 +1,111 @@
0
+#!/bin/bash
1
+#
2
+# This script installs the bundle to Docker Machine instances, for the purpose
3
+# of testing the latest Docker with Swarm mode enabled.
4
+# Do not use in production.
5
+#
6
+# Requirements (on host to run this script)
7
+#  - bash is installed
8
+#  - Docker Machine is installed
9
+#  - GNU tar is installed
10
+#
11
+# Requirements (on Docker machine instances)
12
+#  - Docker can be managed via one of  `systemctl`, `service`, or `/etc/init.d/docker`
13
+#
14
+set -e
15
+set -o pipefail
16
+
17
+errexit() {
18
+    echo "$1"
19
+    exit 1
20
+}
21
+
22
+BUNDLE="bundles/$(cat VERSION)"
23
+
24
+bundle_files(){
25
+    # prefer dynbinary if exists
26
+    for f in dockerd docker-proxy; do
27
+	if [ -d $BUNDLE/dynbinary-daemon ]; then
28
+	    echo $BUNDLE/dynbinary-daemon/$f
29
+	else
30
+	    echo $BUNDLE/binary-daemon/$f
31
+	fi
32
+    done
33
+    for f in docker-containerd docker-containerd-ctr docker-containerd-shim docker-init docker-runc; do
34
+	echo $BUNDLE/binary-daemon/$f
35
+    done
36
+    if [ -d $BUNDLE/dynbinary-client ]; then
37
+	echo $BUNDLE/dynbinary-client/docker
38
+    else
39
+	echo $BUNDLE/binary-client/docker
40
+    fi
41
+}
42
+
43
+control_docker(){
44
+    m=$1; op=$2
45
+    # NOTE: `docker-machine ssh $m sh -c "foo bar"` does not work
46
+    #       (but `docker-machine ssh $m sh -c "foo\ bar"` works)
47
+    #       Anyway we avoid using `sh -c` here for avoiding confusion
48
+    cat <<EOF | docker-machine ssh $m sudo sh
49
+if command -v systemctl > /dev/null; then
50
+  systemctl $op docker
51
+elif command -v service > /dev/null; then
52
+  service docker $op
53
+elif [ -x /etc/init.d/docker ]; then
54
+  /etc/init.d/docker $op
55
+else
56
+  echo "not sure how to control the docker daemon"
57
+  exit 1
58
+fi
59
+EOF
60
+}
61
+
62
+detect_prefix(){
63
+    m=$1
64
+    script='dirname $(dirname $(which dockerd))'
65
+    echo $script | docker-machine ssh $m sh
66
+}
67
+
68
+install_to(){
69
+    m=$1; shift; files=$@
70
+    echo "$m: detecting docker"
71
+    prefix=$(detect_prefix $m)
72
+    echo "$m: detected docker on $prefix"
73
+    echo "$m: stopping docker"
74
+    control_docker $m stop
75
+    echo "$m: installing docker"
76
+    # NOTE: GNU tar is required because we use --transform here
77
+    # TODO: compression (should not be default)
78
+    tar ch --transform 's/.*\///' $files | docker-machine ssh $m sudo tar Cx $prefix/bin
79
+    echo "$m: starting docker"
80
+    control_docker $m start
81
+    echo "$m: done"
82
+}
83
+
84
+check_prereq(){
85
+    command -v docker-machine > /dev/null || errexit "docker-machine not installed"
86
+    ( tar --version | grep GNU > /dev/null ) || errexit "GNU tar not installed"
87
+}
88
+
89
+case "$1" in
90
+    "install")
91
+	shift; machines=$@
92
+	check_prereq
93
+	files=$(bundle_files)
94
+	echo "Files to be installed:"
95
+	for f in $files; do echo $f; done
96
+	pids=()
97
+	for m in $machines; do
98
+	    install_to $m $files &
99
+	    pids+=($!)
100
+	done
101
+	status=0
102
+	for pid in ${pids[@]}; do
103
+	    wait $pid || { status=$?; echo "background process $pid failed with exit status $status"; }
104
+	done
105
+	exit $status
106
+	;;
107
+    *)
108
+	errexit "Usage: $0 install MACHINES"
109
+	;;
110
+esac