diff --git a/proxy/proxy.go b/proxy/proxy.go index 240e098b..1751b48c 100644 --- a/proxy/proxy.go +++ b/proxy/proxy.go @@ -108,7 +108,7 @@ func (proxy *Proxy) ListenAndServe() error { listener = tls.NewListener(listener, proxy.TLSConfig.Config) } - Info.Println("proxy listening") + Info.Println("proxy listening on", proxy.ListenAddr) return (&http.Server{Handler: proxy}).Serve(listener) } diff --git a/site/proxy.md b/site/proxy.md index bfbe7eef..5f2ae23b 100644 --- a/site/proxy.md +++ b/site/proxy.md @@ -40,13 +40,18 @@ interfaces. This can be adjusted with the `-H` argument, e.g. host1$ weave launch-proxy -H tcp://127.0.0.1:9999 -All docker commands can be run via the proxy, so it is safe to -globally adjust your `DOCKER_HOST` to point at the proxy, e.g. +All docker commands can be run via the proxy, so it is safe to adjust +your `DOCKER_HOST` to point at the proxy. Weave provides a convenient +command for this: - host1$ export DOCKER_HOST=tcp://localhost:12375 + host1$ eval "$(weave proxy-env)" host1$ docker ps ... +Alternatively, the proxy host can be set on a per-command basis with + + host1$ docker $(weave proxy-config) ps + If you are working with a remote docker daemon, then `localhost` in the above needs to be replaced with the docker daemon host, and any firewalls inbetween need to be configured to permit access to @@ -137,12 +142,12 @@ to point at the latter: host1$ weave launch -iprange 10.2.3.0/24 host1$ weave launch-dns 10.2.4.1/24 host1$ weave launch-proxy --with-ipam --with-dns - host1$ export DOCKER_HOST=tcp://localhost:12375 + host1$ eval "$(weave proxy-env)" host2$ weave launch -iprange 10.2.3.0/24 host1 host2$ weave launch-dns 10.2.4.2/24 host2$ weave launch-proxy --with-ipam --with-dns - host2$ export DOCKER_HOST=tcp://localhost:12375 + host1$ eval "$(weave proxy-env)" NB: Note that the two weaveDNS instances must be given unique IPs, on a subnet different from that used for IP allocation. @@ -195,7 +200,8 @@ with $ mkdir -pv ~/.docker $ cp -v {ca,cert,key}.pem ~/.docker - $ export DOCKER_HOST=tcp://host1:12375 DOCKER_TLS_VERIFY=1 + $ eval "$(weave proxy-env)" + $ export DOCKER_TLS_VERIFY=1 $ docker version ... diff --git a/test/650_proxy_env_test.sh b/test/650_proxy_env_test.sh new file mode 100644 index 00000000..20a65729 --- /dev/null +++ b/test/650_proxy_env_test.sh @@ -0,0 +1,13 @@ +#! /bin/bash + +. ./config.sh + +start_suite "Configure the docker daemon for the proxy" + +weave_on $HOST1 launch-proxy + +CMD="run -e WEAVE_CIDR=10.2.1.4/24 $BASE_IMAGE $CHECK_ETHWE_UP" +assert_raises "eval '$(weave_on $HOST1 proxy-env)' ; docker $CMD" +assert_raises "docker $(weave_on $HOST1 proxy-config) $CMD" + +end_suite diff --git a/weave b/weave index 68603848..92f0212b 100755 --- a/weave +++ b/weave @@ -16,6 +16,8 @@ IMAGE_VERSION=${VERSION:-$IMAGE_VERSION} DOCKERHUB_USER=weaveworks BASE_EXEC_IMAGE=$DOCKERHUB_USER/weaveexec EXEC_IMAGE=$BASE_EXEC_IMAGE:$IMAGE_VERSION +PROXY_HOST=${PROXY_HOST:-$(echo "${DOCKER_HOST#tcp://}" | cut -s -d: -f1)} +PROXY_HOST=${PROXY_HOST:-127.0.0.1} # Define some regular expressions for matching addresses. # The regexp here is far from precise, but good enough. @@ -41,6 +43,8 @@ usage() { echo "weave hide [ ...]" echo "weave ps [ ...]" echo "weave status" + echo "weave proxy-env" + echo "weave proxy-config" echo "weave version" echo "weave stop" echo "weave stop-dns" @@ -69,6 +73,7 @@ exec_remote() { -e WEAVE_PORT \ -e WEAVE_CONTAINER_NAME \ -e DOCKER_BRIDGE \ + -e PROXY_HOST="$PROXY_HOST" \ $WEAVEEXEC_DOCKER_ARGS $EXEC_IMAGE --local "$@" } @@ -171,6 +176,7 @@ MTU=65535 PORT=${WEAVE_PORT:-6783} HTTP_PORT=6784 DNS_HTTP_PORT=6785 +PROXY_PORT=12375 PROXY_CONTAINER_NAME=weaveproxy @@ -805,6 +811,19 @@ proxy_args() { done } +proxy_addr() { + if addr=$(docker logs weaveproxy | head -n3 | grep -oE "proxy listening on .*"); then + addr=${addr##* } + host=${addr%:*} + [ "$host" = "0.0.0.0" ] && host=$PROXY_HOST + port=${addr#*:} + echo "${1}tcp://${host:-$PROXY_HOST}:${port:-$PROXY_PORT}" + return 0 + fi + echo "$PROXY_CONTAINER_NAME container is not present. Have you launched it?" >&2 + return 1 +} + ########################################################################################## [ $(id -u) = 0 ] || { @@ -953,6 +972,12 @@ case "$COMMAND" in wait_for_log $PROXY_CONTAINER_NAME "proxy listening" echo $PROXY_CONTAINER ;; + proxy-env) + proxy_addr "export DOCKER_HOST=" + ;; + proxy-config) + proxy_addr "-H=" + ;; connect) [ $# -gt 0 ] || usage if [ "$1" == "--replace" ]; then