Skip to content

Instantly share code, notes, and snippets.

@phemmer
Created January 23, 2015 12:59
Show Gist options
  • Select an option

  • Save phemmer/569105182a025746cb99 to your computer and use it in GitHub Desktop.

Select an option

Save phemmer/569105182a025746cb99 to your computer and use it in GitHub Desktop.
swarm-docker launch
#!/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