Created
January 23, 2015 12:59
-
-
Save phemmer/569105182a025746cb99 to your computer and use it in GitHub Desktop.
swarm-docker launch
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| #!/bin/bash | |
| num_dockers=3 | |
| docker_image=dind | |
| ######################################## | |
| deferred=() | |
| deferred_pid=$BASHPID | |
| run_deferred() { | |
| if [[ "$deferred_pid" != $BASHPID ]]; then | |
| # we are a subshell, don't execute statements created in parent | |
| return | |
| fi | |
| set +e | |
| for (( i=${#deferred[@]} - 1; i >= 0; i-- )); do | |
| eval "${deferred[i]}" | |
| done | |
| } | |
| trap run_deferred EXIT | |
| defer() { | |
| if [[ "$deferred_pid" != $BASHPID ]]; then | |
| # $deferred was inherited from a parent (we are a subshell). re-initialize it | |
| deferred=() | |
| deferred_pid=$BASHPID | |
| trap run_deferred EXIT | |
| fi | |
| deferred+=( "$cmd" ) | |
| } | |
| defera() { | |
| printf -v cmd '%q ' "$@" | |
| defer "$cmd" | |
| } | |
| ######################################## | |
| set -e | |
| cd "$(git rev-parse --show-toplevel)" | |
| docker_start() { | |
| i="$1" | |
| id="$(docker run -d --privileged "$docker_image" docker -dD -H tcp://0.0.0.0:2375)" | |
| defera docker rm -v -f "$id" | |
| defera docker stop "$id" | |
| ip=$(docker inspect --format '{{.NetworkSettings.IPAddress}}' "$id") | |
| export DOCKER_CONTAINER_ID_"$i"="$id" | |
| export DOCKER_IP_"$i"="$ip" | |
| export DOCKER_ADDR_"$i"="$ip:2375" | |
| export DOCKER_HOST_"$i"="tcp://$ip:2375" | |
| echo "$ip:2375" >> "$SWARM_DISCOVERY_FILE" | |
| echo "Docker $1: $ip:2375 - DOCKER_HOST=\$DOCKER_HOST_$i" | |
| } | |
| docker_wait_ready() { | |
| docker_host_var="DOCKER_HOST_$i" | |
| timeout="$(( $(date +%s) + 5 ))" | |
| while (( $(date +%s) < timeout )); do | |
| if DOCKER_HOST="${!docker_host_var}" docker info &>/dev/null; then | |
| return | |
| fi | |
| sleep 0.2 | |
| done | |
| echo "Timed out waiting for docker:$i (${!docker_host_var}) to start" | |
| return 1 | |
| } | |
| export SWARM_DISCOVERY_FILE="$(pwd)/.swarm_discovery" | |
| :>"$SWARM_DISCOVERY_FILE" | |
| export SWARM_DISCOVERY="file://$(pwd)/.swarm_discovery" | |
| echo "Swarm discovery: $SWARM_DISCOVERY - \$SWARM_DISCOVERY" | |
| for (( i=0; i<num_dockers; i++ )); do | |
| docker_start $i | |
| done | |
| for (( i=0; i<num_dockers; i++ )); do | |
| docker_wait_ready $i | |
| done | |
| # determine which swarm binary to use | |
| # look through possible locations, and choose the one with the latest mtime | |
| swarm="$(command -v swarm)" | |
| swarm_mtime="$(stat --format '%Y' "$swarm")" | |
| if [[ -x swarm ]]; then | |
| swarm_dev='./swarm' | |
| swarm_dev_mtime="$(stat --format '%Y' "$swarm_dev")" | |
| if (( swarm_dev_mtime > swarm_mtime )); then | |
| swarm="$swarm_dev" | |
| swarm_mtime="$swarm_dev_mtime" | |
| fi | |
| fi | |
| $swarm --debug manage --host 127.0.0.1:2375 > >(logger -t swarm -p user.info) 2> >(logger -t swarm -p user.err) </dev/null & | |
| swarm_pid="$!" | |
| defera kill $swarm_pid | |
| export SWARM_HOST="127.0.0.1:2375" | |
| echo "Swarm: $SWARM_HOST - DOCKER_HOST=\$SWARM_HOST" | |
| SHELLSTACK="$SHELLSTACK docker-swarm" DOCKER_HOST="tcp://$SWARM_HOST" $SHELL |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment