diff --git a/scope b/scope index dbb589a28..47d941654 100755 --- a/scope +++ b/scope @@ -2,6 +2,8 @@ set -eu +ARGS="$@" + usage() { echo "Usage:" echo "scope launch [ ...]" @@ -22,6 +24,7 @@ IMAGE_VERSION=${VERSION:-$IMAGE_VERSION} SCOPE_IMAGE_NAME=weaveworks/scope SCOPE_IMAGE=$SCOPE_IMAGE_NAME:$IMAGE_VERSION SCOPE_CONTAINER_NAME=weavescope +SCOPE_APP_CONTAINER_NAME=weavescope-app IP_REGEXP="[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}" IP_ADDR_CMD="find /sys/class/net -type l | xargs -n1 basename | grep -vE 'docker|veth|lo' | \ xargs -n1 ip addr show | grep inet | awk '{ print \$2 }' | grep -oE '$IP_REGEXP'" @@ -61,6 +64,17 @@ check_docker_version() { fi } +check_probe_only() { + echo "${ARGS}" | grep -q -E "\-\-no\-app|\-\-service\-token|\-\-probe\-only" +} + +check_docker_for_mac() { + docker_for_mac_network_mode="${HOME}/Library/Containers/com.docker.docker/Data/database/com.docker.driver.amd64-linux/network" + [ "$(uname)" = "Darwin" ] \ + && [ -S /var/run/docker.sock ] \ + && grep -q hybrid $docker_for_mac_network_mode 2>/dev/null +} + # Check that a container named $1 with image $2 is not running check_not_running() { case $(docker inspect --format='{{.State.Running}} {{.Config.Image}}' $1 2>/dev/null) in @@ -97,6 +111,13 @@ launch_command() { $WEAVESCOPE_DOCKER_ARGS $SCOPE_IMAGE --probe.docker=true "$@" } +launch_app_command() { + echo docker run -d --name=$SCOPE_APP_CONTAINER_NAME \ + -e CHECKPOINT_DISABLE \ + -p 0.0.0.0:4040:4040 \ + $WEAVESCOPE_DOCKER_ARGS $SCOPE_IMAGE --no-probe "$@" +} + check_docker_version case "$COMMAND" in @@ -128,18 +149,38 @@ EOF ;; launch) - check_not_running $SCOPE_CONTAINER_NAME $SCOPE_IMAGE_NAME - docker rm -f $SCOPE_CONTAINER_NAME >/dev/null 2>&1 || true + if ! check_docker_for_mac || check_probe_only ; then + check_not_running $SCOPE_CONTAINER_NAME $SCOPE_IMAGE_NAME + docker rm -f $SCOPE_CONTAINER_NAME >/dev/null 2>&1 || true + CONTAINER=$($(launch_command "$@")) + echo $CONTAINER + elif check_docker_for_mac ; then + # Docker for Mac (as of beta9) does not ship vmnet driver and + # thereby only access container ports via a tunnel, preventing + # access to host ports of the VM. + # - https://github.com/weaveworks/scope/issues/1411 + # - https://forums.docker.com/t/ports-in-host-network-namespace-are-not-accessible/10789 + check_not_running $SCOPE_APP_CONTAINER_NAME $SCOPE_IMAGE_NAME + docker rm -f $SCOPE_APP_CONTAINER_NAME >/dev/null 2>&1 || true + CONTAINER=$($(launch_app_command "$@")) + echo $CONTAINER + app_ip=$(docker inspect -f '{{.NetworkSettings.IPAddress}}' "${CONTAINER}") + check_not_running $SCOPE_CONTAINER_NAME $SCOPE_IMAGE_NAME + docker rm -f $SCOPE_CONTAINER_NAME >/dev/null 2>&1 || true + CONTAINER=$($(launch_command --no-app "$@" "${app_ip}:4040")) + echo $CONTAINER + fi - CONTAINER=$($(launch_command "$@")) - echo $CONTAINER - - if ! echo "$@" | grep -E "\-\-no\-app|\-\-service\-token" 1>/dev/null; then + if ! check_probe_only ; then IP_ADDRS=$(docker run --rm --net=host --entrypoint /bin/sh $SCOPE_IMAGE -c "$IP_ADDR_CMD") echo "Weave Scope is reachable at the following URL(s):" >&2 - for ip in $IP_ADDRS; do - echo " * http://$ip:4040/" >&2 - done + if ! check_docker_for_mac ; then + for ip in $IP_ADDRS; do + echo " * http://$ip:4040/" >&2 + done + else + echo " * http://localhost:4040/" >&2 + fi fi ;; @@ -148,6 +189,11 @@ EOF if ! docker stop $SCOPE_CONTAINER_NAME >/dev/null 2>&1 ; then echo "Weave Scope is not running." >&2 fi + if check_docker_for_mac ; then + if ! docker stop $SCOPE_APP_CONTAINER_NAME >/dev/null 2>&1 ; then + echo "Weave Scope app is not running." >&2 + fi + fi ;; *)