diff --git a/.gitignore b/.gitignore index 158060a2..2fd760f9 100644 --- a/.gitignore +++ b/.gitignore @@ -35,4 +35,5 @@ tools/build releases weave.tar weavedns.tar -weavetools.tar +weaveexec.tar +weaveexec/docker*.tgz diff --git a/Makefile b/Makefile index e52bfb5c..c9f0365b 100644 --- a/Makefile +++ b/Makefile @@ -1,4 +1,4 @@ -PUBLISH=publish_weave publish_weavedns publish_weavetools +PUBLISH=publish_weave publish_weavedns publish_weaveexec .DEFAULT: all .PHONY: all update tests publish $(PUBLISH) clean prerequisites build @@ -10,15 +10,18 @@ DOCKERHUB_USER=zettio WEAVE_VERSION=git-$(shell git rev-parse --short=12 HEAD) WEAVER_EXE=weaver/weaver WEAVEDNS_EXE=weavedns/weavedns -WEAVETOOLS_EXES=tools/bin WEAVER_IMAGE=$(DOCKERHUB_USER)/weave WEAVEDNS_IMAGE=$(DOCKERHUB_USER)/weavedns -WEAVETOOLS_IMAGE=$(DOCKERHUB_USER)/weavetools +WEAVEEXEC_IMAGE=$(DOCKERHUB_USER)/weaveexec WEAVER_EXPORT=weave.tar WEAVEDNS_EXPORT=weavedns.tar -WEAVETOOLS_EXPORT=weavetools.tar +WEAVEEXEC_EXPORT=weaveexec.tar -all: $(WEAVER_EXPORT) $(WEAVEDNS_EXPORT) $(WEAVETOOLS_EXPORT) +WEAVEEXEC_DOCKER_VERSION=1.3.1 +DOCKER_DISTRIB=weaveexec/docker-$(WEAVEEXEC_DOCKER_VERSION).tgz +DOCKER_DISTRIB_URL=https://get.docker.com/builds/Linux/x86_64/docker-$(WEAVEEXEC_DOCKER_VERSION).tgz + +all: $(WEAVER_EXPORT) $(WEAVEDNS_EXPORT) $(WEAVEEXEC_EXPORT) update: go get -u -f -v -tags -netgo ./$(dir $(WEAVER_EXE)) ./$(dir $(WEAVEDNS_EXE)) @@ -38,18 +41,6 @@ $(WEAVER_EXE) $(WEAVEDNS_EXE): common/*.go $(WEAVER_EXE): router/*.go weaver/main.go $(WEAVEDNS_EXE): nameserver/*.go weavedns/main.go -build_weavetools_exes_in_container=yes - -$(WEAVETOOLS_EXES): tools/build.sh -ifdef build_weavetools_exes_in_container - $(SUDO) docker run --rm -t -v $(realpath $( $@ @@ -58,9 +49,14 @@ $(WEAVEDNS_EXPORT): weavedns/Dockerfile $(WEAVEDNS_EXE) $(SUDO) docker build -t $(WEAVEDNS_IMAGE) weavedns $(SUDO) docker save $(WEAVEDNS_IMAGE):latest > $@ -$(WEAVETOOLS_EXPORT): tools/Dockerfile $(WEAVETOOLS_EXES) - $(SUDO) docker build -t $(WEAVETOOLS_IMAGE) tools - $(SUDO) docker save $(WEAVETOOLS_IMAGE):latest > $@ +$(WEAVEEXEC_EXPORT): weaveexec/Dockerfile $(DOCKER_DISTRIB) weave + cp weave weaveexec/weave + cp $(DOCKER_DISTRIB) weaveexec/docker.tgz + $(SUDO) docker build -t $(WEAVEEXEC_IMAGE) weaveexec + $(SUDO) docker save $(WEAVEEXEC_IMAGE):latest > $@ + +$(DOCKER_DISTRIB): + curl -o $(DOCKER_DISTRIB) $(DOCKER_DISTRIB_URL) # Add more directories in here as more tests are created tests: @@ -75,11 +71,10 @@ $(PUBLISH): publish_%: publish: $(PUBLISH) clean: - -$(SUDO) docker rmi $(WEAVER_IMAGE) $(WEAVEDNS_IMAGE) $(WEAVETOOLS_IMAGE) - rm -f $(WEAVER_EXE) $(WEAVEDNS_EXE) $(WEAVER_EXPORT) $(WEAVEDNS_EXPORT) $(WEAVETOOLS_EXPORT) - $(SUDO) rm -rf $(WEAVETOOLS_EXES) + -$(SUDO) docker rmi $(WEAVER_IMAGE) $(WEAVEDNS_IMAGE) $(WEAVEEXEC_IMAGE) + rm -f $(WEAVER_EXE) $(WEAVEDNS_EXE) $(WEAVER_EXPORT) $(WEAVEDNS_EXPORT) $(WEAVEEXEC_EXPORT) build: $(SUDO) go clean -i net $(SUDO) go install -tags netgo std - $(MAKE) build_weavetools_exes_in_container= + $(MAKE) diff --git a/README.md b/README.md index 89e51691..b3f686d1 100644 --- a/README.md +++ b/README.md @@ -36,6 +36,9 @@ Ensure you are running Linux (kernel 3.5 or later) and have Docker CoreOS users see [here](https://github.com/fintanr/weave-gs/blob/master/coreos-simple/user-data) for an example of installing weave using cloud-config. +Weave respects the environment variable `DOCKER_HOST`, so you can run +it locally to control a weave network on a remote host. + ## Quick Start Screencast diff --git a/site/building.md b/site/building.md index 509d54d4..915c03f5 100644 --- a/site/building.md +++ b/site/building.md @@ -50,8 +50,8 @@ $ make This will build the weave components and package them into three Docker images (`zettio/weave`, `zettio/weavedns`, and -`zettio/weavetools`). These are then exported (as -`weave.tar`, `weavedns.tar` and `weavetools.tar`). +`zettio/weaveexec`). These are then exported (as `weave.tar`, +`weavedns.tar` and `weaveexec.tar`). ## Building in a Docker container diff --git a/test/100_cross_hosts_test.sh b/test/100_cross_hosts_test.sh index 6073b581..7d95a519 100755 --- a/test/100_cross_hosts_test.sh +++ b/test/100_cross_hosts_test.sh @@ -8,16 +8,16 @@ C2=10.2.1.7 start_suite "Ping over cross-host weave network" for HOST in $HOST1 $HOST2; do - run_on $HOST sudo $WEAVE stop || true - run_on $HOST sudo $WEAVE stop-dns || true + weave_on $HOST stop || true + weave_on $HOST stop-dns || true docker_on $HOST rm -f c1 c2 || true done -run_on $HOST1 sudo $WEAVE launch -run_on $HOST2 sudo $WEAVE launch $HOST1 +weave_on $HOST1 launch +weave_on $HOST2 launch $HOST1 -run_on $HOST2 sudo $WEAVE run $C2/24 -t --name=c2 ubuntu -run_on $HOST1 sudo $WEAVE run $C1/24 -t --name=c1 ubuntu +weave_on $HOST2 run $C2/24 -t --name=c2 ubuntu +weave_on $HOST1 run $C1/24 -t --name=c1 ubuntu ok=$(docker -H tcp://$HOST1:2375 exec -i c1 sh -c "ping -q -c 4 $C2 >&2 && echo ok") assert "echo $ok" "ok" diff --git a/test/110_encryption_test.sh b/test/110_encryption_test.sh index 9ac8a903..ecf1f857 100755 --- a/test/110_encryption_test.sh +++ b/test/110_encryption_test.sh @@ -8,16 +8,16 @@ C2=10.2.1.7 start_suite "Ping over encrypted cross-host weave network" for HOST in $HOST1 $HOST2; do - run_on $HOST sudo $WEAVE stop || true - run_on $HOST sudo $WEAVE stop-dns || true + weave_on $HOST stop || true + weave_on $HOST stop-dns || true docker_on $HOST rm -f c1 c2 || true done -run_on $HOST1 sudo $WEAVE launch -password notverysecure -run_on $HOST2 sudo $WEAVE launch -password notverysecure $HOST1 +weave_on $HOST1 launch -password notverysecure +weave_on $HOST2 launch -password notverysecure $HOST1 -run_on $HOST2 sudo $WEAVE run $C2/24 -t --name=c2 ubuntu -run_on $HOST1 sudo $WEAVE run $C1/24 -t --name=c1 ubuntu +weave_on $HOST2 run $C2/24 -t --name=c2 ubuntu +weave_on $HOST1 run $C1/24 -t --name=c1 ubuntu ok=$(docker -H tcp://$HOST1:2375 exec -i c1 sh -c "ping -q -c 4 $C2 >&2 && echo ok") assert "echo $ok" "ok" diff --git a/test/200_dns_test.sh b/test/200_dns_test.sh index a918f699..a05ced4e 100755 --- a/test/200_dns_test.sh +++ b/test/200_dns_test.sh @@ -7,14 +7,14 @@ C2=10.2.0.34 start_suite "Resolve names on a single host" -run_on $HOST1 sudo $WEAVE stop || true -run_on $HOST1 sudo $WEAVE stop-dns || true -run_on $HOST1 sudo $WEAVE launch-dns 10.2.254.1/24 +weave_on $HOST1 stop || true +weave_on $HOST1 stop-dns || true +weave_on $HOST1 launch-dns 10.2.254.1/24 docker_on $HOST1 rm -f c1 c2 || true -run_on $HOST1 sudo $WEAVE run $C2/24 -t --name=c2 -h seetwo.weave.local ubuntu -run_on $HOST1 sudo $WEAVE run --with-dns $C1/24 -t --name=c1 aanand/docker-dnsutils /bin/sh +weave_on $HOST1 run $C2/24 -t --name=c2 -h seetwo.weave.local ubuntu +weave_on $HOST1 run --with-dns $C1/24 -t --name=c1 aanand/docker-dnsutils /bin/sh ok=$(docker -H tcp://$HOST1:2375 exec -i c1 sh -c "dig +short seetwo.weave.local") assert "echo $ok" "$C2" diff --git a/test/210_dns_multicast_test.sh b/test/210_dns_multicast_test.sh index 2474c109..ef720f73 100755 --- a/test/210_dns_multicast_test.sh +++ b/test/210_dns_multicast_test.sh @@ -8,19 +8,19 @@ C2=10.2.3.34 start_suite "Resolve names across hosts" for host in $HOST1 $HOST2; do - run_on $host sudo $WEAVE stop || true - run_on $host sudo $WEAVE stop-dns || true + weave_on $host stop || true + weave_on $host stop-dns || true docker_on $host rm -f c1 c2 || true done -run_on $HOST1 sudo $WEAVE launch -run_on $HOST2 sudo $WEAVE launch $HOST1 +weave_on $HOST1 launch +weave_on $HOST2 launch $HOST1 -run_on $HOST1 sudo $WEAVE launch-dns 10.2.254.1/24 -debug -run_on $HOST2 sudo $WEAVE launch-dns 10.2.254.2/24 -debug +weave_on $HOST1 launch-dns 10.2.254.1/24 -debug +weave_on $HOST2 launch-dns 10.2.254.2/24 -debug -run_on $HOST2 sudo $WEAVE run $C2/24 -t --name=c2 -h seetwo.weave.local ubuntu -run_on $HOST1 sudo $WEAVE run --with-dns $C1/24 --name=c1 -t aanand/docker-dnsutils /bin/sh +weave_on $HOST2 run $C2/24 -t --name=c2 -h seetwo.weave.local ubuntu +weave_on $HOST1 run --with-dns $C1/24 --name=c1 -t aanand/docker-dnsutils /bin/sh ok=$(docker -H tcp://$HOST1:2375 exec -i c1 dig +short seetwo.weave.local) assert "echo $ok" "$C2" diff --git a/test/220_dns_custom_test.sh b/test/220_dns_custom_test.sh index 73c9d07e..835ebd98 100755 --- a/test/220_dns_custom_test.sh +++ b/test/220_dns_custom_test.sh @@ -7,14 +7,14 @@ C2=10.2.54.91 start_suite "Resolve names in custom domain" -run_on $HOST1 sudo $WEAVE stop || true -run_on $HOST1 sudo $WEAVE stop-dns || true -run_on $HOST1 sudo $WEAVE launch-dns 10.2.254.1/24 --localDomain foo.bar. +weave_on $HOST1 stop || true +weave_on $HOST1 stop-dns || true +weave_on $HOST1 launch-dns 10.2.254.1/24 --localDomain foo.bar. docker_on $HOST1 rm -f c1 c2 || true -run_on $HOST1 sudo $WEAVE run $C2/24 -t --name=c2 -h seetwo.foo.bar ubuntu -run_on $HOST1 sudo $WEAVE run --with-dns $C1/24 -t --name=c1 aanand/docker-dnsutils /bin/sh +weave_on $HOST1 run $C2/24 -t --name=c2 -h seetwo.foo.bar ubuntu +weave_on $HOST1 run --with-dns $C1/24 -t --name=c1 aanand/docker-dnsutils /bin/sh ok=$(docker -H tcp://$HOST1:2375 exec -i c1 sh -c "dig +short seetwo.foo.bar.") assert "echo $ok" "$C2" diff --git a/test/300_fallback_dns_test.sh b/test/300_fallback_dns_test.sh index 5a2ba74f..49131c59 100755 --- a/test/300_fallback_dns_test.sh +++ b/test/300_fallback_dns_test.sh @@ -4,11 +4,11 @@ start_suite "Resolve a non-weave address" -run_on $HOST1 sudo $WEAVE stop-dns || true -run_on $HOST1 sudo $WEAVE launch-dns 10.2.254.1/24 -debug +weave_on $HOST1 stop-dns || true +weave_on $HOST1 launch-dns 10.2.254.1/24 -debug docker_on $HOST1 rm -f c1 || true -run_on $HOST1 sudo $WEAVE run --with-dns 10.2.1.5/24 --name=c1 -t aanand/docker-dnsutils /bin/sh +weave_on $HOST1 run --with-dns 10.2.1.5/24 --name=c1 -t aanand/docker-dnsutils /bin/sh ok=$(docker -H tcp://$HOST1:2375 exec -i c1 dig +short -t MX weave.works) assert "test -n \"$ok\" && echo pass" "pass" diff --git a/test/400_weave_local_test.sh b/test/400_weave_local_test.sh new file mode 100755 index 00000000..52fcb741 --- /dev/null +++ b/test/400_weave_local_test.sh @@ -0,0 +1,19 @@ +#!/bin/bash + +. ./config.sh + +start_suite "Run weave with --local" + +run_on $HOST1 sudo ./weave --local reset + +run_on $HOST1 sudo ./weave --local launch +assert_raises "docker_on $HOST1 ps | grep weave" 0 + +docker_on $HOST1 rm -f c1 || true +run_on $HOST1 sudo ./weave --local run 10.2.6.5/24 -ti --name=c1 ubuntu +ok=$(docker -H tcp://$HOST1:2375 exec -i c1 sh -c "ifconfig | grep ethwe") +assert "test -n \"$ok\" && echo pass" "pass" + +docker_on $HOST1 rm -f c1 || true + +end_suite diff --git a/test/Vagrantfile b/test/Vagrantfile index dba4f411..92ade5e7 100644 --- a/test/Vagrantfile +++ b/test/Vagrantfile @@ -6,7 +6,7 @@ ip_prefix = "192.168.48" ip_suffix_base = 10 def configure_docker(host, hostname, ip) - pkgs = "lxc-docker" + pkgs = "lxc-docker ethtool" host.vm.box = "phusion/ubuntu-14.04-amd64" host.vm.box_url = "https://oss-binaries.phusionpassenger.com/vagrant/boxes/latest/ubuntu-14.04-amd64-vbox.box" diff --git a/test/config.sh b/test/config.sh index 9bd15125..59743095 100644 --- a/test/config.sh +++ b/test/config.sh @@ -50,6 +50,13 @@ docker_on() { docker -H tcp://$host:2375 $@ } +weave_on() { + host=$1 + shift 1 + greyly echo "Weave on $host: $@" + DOCKER_HOST=tcp://$host:2375 $WEAVE $@ +} + start_suite() { whitely echo $@ } @@ -58,5 +65,5 @@ end_suite() { whitely assert_end } -WEAVE=./bin/weave +WEAVE=../weave DOCKER_NS=./bin/docker-ns diff --git a/test/setup.sh b/test/setup.sh index 3c31863c..fd7d1ff9 100755 --- a/test/setup.sh +++ b/test/setup.sh @@ -13,11 +13,10 @@ echo Copying weave images and script to hosts for HOST in $HOSTS; do docker_on $HOST load -i ../weave.tar docker_on $HOST load -i ../weavedns.tar - docker_on $HOST load -i ../weavetools.tar - run_on $HOST mkdir -p `dirname $WEAVE` - cat ../weave | run_on $HOST sh -c "cat > $WEAVE" + docker_on $HOST load -i ../weaveexec.tar + run_on $HOST mkdir -p bin cat ../bin/docker-ns | run_on $HOST sh -c "cat > $DOCKER_NS" - run_on $HOST chmod a+x $WEAVE - run_on $HOST chmod a+x $DOCKER_NS + cat ../weave | run_on $HOST sh -c "cat > ./weave" + run_on $HOST chmod a+x $DOCKER_NS ./weave run_on $HOST sudo service docker restart done diff --git a/tools/Dockerfile b/tools/Dockerfile deleted file mode 100644 index f244fee7..00000000 --- a/tools/Dockerfile +++ /dev/null @@ -1,3 +0,0 @@ -FROM scratch -MAINTAINER Weaveworks Inc -ADD ./bin /bin diff --git a/tools/build.sh b/tools/build.sh deleted file mode 100644 index 87528a09..00000000 --- a/tools/build.sh +++ /dev/null @@ -1,62 +0,0 @@ -#!/bin/sh - -# Show the progress of this script, in case it fails. -set -x -e - -sudo apt-get -y update -sudo apt-get -y install curl make pkg-config gcc bison flex - -BASEDIR=$(dirname $0) -mkdir -p "$BASEDIR"/bin - -copy_exe() { - if ldd $1 >/dev/null 2>&1 ; then - echo "ERROR: $1 was not linked statically." 2>&1 - exit 1 - fi - cp $1 "$BASEDIR"/bin/ -} - -# ethtool - -ETHTOOL=ethtool-3.16 - -rm -rf $ETHTOOL - -curl -s -S https://www.kernel.org/pub/software/network/ethtool/$ETHTOOL.tar.gz | tar xvz -(cd $ETHTOOL; ./configure LDFLAGS=-static && make) -copy_exe $ETHTOOL/ethtool - -# conntrack - -PACKAGES="libmnl-1.0.3 libnfnetlink-1.0.1 libnetfilter_cttimeout-1.0.0 libnetfilter_cthelper-1.0.0 libnetfilter_queue-1.0.2 libnetfilter_conntrack-1.0.4" -CONNTRACK=conntrack-tools-1.4.2 - -rm -rf $PACKAGES $CONNTRACK - -fetch() { - curl -s -S http://www.netfilter.org/projects/${1%-*}/files/$1.tar.bz2 | tar xj -} - -for PACKAGE in $PACKAGES; do - fetch $PACKAGE - (cd $PACKAGE; ./configure --disable-shared && make && sudo make install) -done - -fetch $CONNTRACK -(cd $CONNTRACK; ./configure --disable-shared && make && rm -f src/conntrack && make LDFLAGS=-all-static) -copy_exe $CONNTRACK/src/conntrack - -# curl - -CURL=curl-7.40.0 - -rm -rf $CURL - -curl -s -S http://curl.haxx.se/download/$CURL.tar.gz | tar xvz -(cd $CURL; ./configure --without-ssl --disable-shared && make && rm src/curl && make LDFLAGS=-all-static) -copy_exe $CURL/src/curl - -# - -touch "$BASEDIR"/bin diff --git a/weave b/weave index e73058f1..c65ff8ae 100755 --- a/weave +++ b/weave @@ -2,6 +2,15 @@ set -e SCRIPT_VERSION="(unreleased version)" +DOCKERHUB_USER=zettio + +if [ "$SCRIPT_VERSION" = "(unreleased version)" ] ; then + IMAGE_VERSION=latest +else + IMAGE_VERSION=$SCRIPT_VERSION +fi + +IMAGE_VERSION=${VERSION:-$IMAGE_VERSION} usage() { echo "Usage:" @@ -27,27 +36,49 @@ usage() { exit 1 } -[ $(id -u) = 0 ] || { - echo "weave must be run as 'root'" >&2 +[ $# -gt 0 ] || usage + +# These are potentially used for remote execs, and have defaults, so +# we introduce them here +DOCKER_BRIDGE=${DOCKER_BRIDGE:-docker0} +PROCFS=${PROCFS:-/proc} + +BASE_IMAGE=$DOCKERHUB_USER/weave +BASE_DNS_IMAGE=$DOCKERHUB_USER/weavedns +BASE_EXEC_IMAGE=$DOCKERHUB_USER/weaveexec +IMAGE=$BASE_IMAGE:$IMAGE_VERSION +DNS_IMAGE=$BASE_DNS_IMAGE:$IMAGE_VERSION +EXEC_IMAGE=$BASE_EXEC_IMAGE:$IMAGE_VERSION + +exec_remote() { + docker run -t --rm \ + -v /var/run/docker.sock:/var/run/docker.sock \ + -v "$PROCFS":/hostproc \ + -e VERSION \ + -e WEAVE_DOCKER_ARGS \ + -e WEAVE_PASSWORD \ + -e DOCKER_BRIDGE \ + -e PROCFS=/hostproc --privileged --net=host \ + $EXEC_IMAGE --local "$@" +} + +# "run" is a special case because we want to use docker directly, +# rather than the docker in $EXEC_IMAGE remotely. That's because we +# are passing arbitrary arguments on to docker run, and we can't rely +# on our baked-in docker to support those arguments. +if [ "$1" = "--local" ]; then + LOCAL="$1" + shift 1 +elif [ "$1" != "run" ]; then + exec_remote "$@" + exit $? +fi + +[ $(id -u) = 0 ] || ([ "$1" = "run" ] && [ -z "$LOCAL" ]) || { + echo "weave must be run as 'root' when run locally" >&2 exit 1 } -[ $# -gt 0 ] || usage - -if [ "$SCRIPT_VERSION" = "(unreleased version)" ] ; then - IMAGE_VERSION=latest -else - IMAGE_VERSION=$SCRIPT_VERSION -fi - -IMAGE_VERSION=${VERSION:-$IMAGE_VERSION} - -BASE_IMAGE=zettio/weave -BASE_DNS_IMAGE=zettio/weavedns -BASE_TOOLS_IMAGE=zettio/weavetools -IMAGE=$BASE_IMAGE:$IMAGE_VERSION -DNS_IMAGE=$BASE_DNS_IMAGE:$IMAGE_VERSION -TOOLS_IMAGE=$BASE_TOOLS_IMAGE:$IMAGE_VERSION CONTAINER_NAME=weave DNS_CONTAINER_NAME=weavedns BRIDGE=weave @@ -56,26 +87,42 @@ MTU=65535 PORT=6783 HTTP_PORT=6784 DNS_HTTP_PORT=6785 -DOCKER_BRIDGE=${DOCKER_BRIDGE:-docker0} -PROCFS=${PROCFS:-/proc} COMMAND=$1 shift 1 +dns_args() { + if [ "$1" = "--with-dns" ] ; then + shift 1 + if [ \( "$DOCKER_VERSION_MAJOR" -lt 1 \) -o \ + \( "$DOCKER_VERSION_MAJOR" -eq 1 -a \ + "$DOCKER_VERSION_MINOR" -lt 2 \) ] ; then + echo "ERROR: The '--with-dns' option requires Docker 1.2.0 or later; you are running $DOCKER_VERSION" >&2 + exit 1 + fi + docker_bridge_ip + DNS_ARG="--dns $DOCKER_BRIDGE_IP" + DNS_SEARCH_ARG="--dns-search=." + for arg in "$@"; do + case $arg in + --dns-search=*) + DNS_SEARCH_ARG="" + ;; + *) + ;; + esac; + done + fi + DNS_ARGS="$DNS_ARG $DNS_SEARCH_ARG" +} + # utility function to check whether a command can be executed by the shell # see http://stackoverflow.com/questions/592620/how-to-check-if-a-program-exists-from-a-bash-script command_exists () { command -v $1 >/dev/null 2>&1 } -run_tool() { - TOOL_NET=$1 - TOOL_COMMAND=$2 - shift 2 - docker run --rm -t --privileged --net=$TOOL_NET $TOOLS_IMAGE /bin/$TOOL_COMMAND "$@" -} - is_cidr() { # The regexp here is far from precise, but good enough. echo "$1" | grep -E '^[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}/[0-9]{1,2}$' >/dev/null @@ -164,11 +211,7 @@ create_bridge() { add_iptables_rule nat POSTROUTING -j WEAVE } if [ ! "$1" = "--without-ethtool" ] ; then - # disable offloading - we do this even when $BRIDGE already exists - # simply because it has the desirable side-effect of ensuring we - # have the $TOOLS_IMAGE and thus do not incur downloading-induced - # delays in more time-sensitive sections elsewhere. - run_tool host ethtool -K $BRIDGE tx off >/dev/null + ethtool -K $BRIDGE tx off >/dev/null fi ip link set dev $BRIDGE up @@ -253,7 +296,7 @@ connect_container_to_bridge() { return 1 fi - if ! run_tool host ethtool -K $GUEST_IFNAME tx off >/dev/null || + if ! ethtool -K $GUEST_IFNAME tx off >/dev/null || ! ip link set $LOCAL_IFNAME master $BRIDGE || ! ip link set $LOCAL_IFNAME up || ! ip link set $GUEST_IFNAME netns $NETNS ; then @@ -275,7 +318,7 @@ launch() { return 1 fi connect_container_to_bridge && - run_tool container:$CONTAINER ethtool -K eth0 tx off >/dev/null && + ip netns exec $NETNS ethtool -K eth0 tx off >/dev/null && ip netns exec $NETNS ip link set $CONTAINER_IFNAME up } @@ -357,7 +400,7 @@ http_call_ip() { http_verb="$3" url="$4" shift 4 - run_tool host curl -s -X $http_verb "$@" http://$ip:$port$url + curl -s -X $http_verb "$@" http://$ip:$port$url } # Perform operation $1 on container ID $2 to local DNS database at address $3 @@ -483,7 +526,7 @@ DOCKER_VERSION_PATCH=$(echo "$DOCKER_VERSION" | cut -d. -f 3) case "$COMMAND" in setup) - for img in $IMAGE $DNS_IMAGE $TOOLS_IMAGE ; do + for img in $IMAGE $DNS_IMAGE $EXEC_IMAGE ; do docker pull $img done ;; @@ -574,49 +617,42 @@ case "$COMMAND" in echo weave script $SCRIPT_VERSION ask_version $CONTAINER_NAME $IMAGE ask_version $DNS_CONTAINER_NAME $DNS_IMAGE - if ! TOOLS_IMAGE_ID=$(docker inspect --format='{{.Id}}' $TOOLS_IMAGE 2>/dev/null) ; then - echo "Unable to find $TOOLS_IMAGE image." >&2 + if ! EXEC_IMAGE_ID=$(docker inspect --format='{{.Id}}' $EXEC_IMAGE 2>/dev/null) ; then + echo "Unable to find $EXEC_IMAGE image." >&2 else - TOOLS_VERSION=$(docker images --no-trunc | grep $TOOLS_IMAGE_ID | grep -v latest | tr -s ' ' | cut -d ' ' -f 2 | tr "\n" ' ') - if [ -n "$TOOLS_VERSION" ] ; then - echo "weave tools $TOOLS_VERSION" + EXEC_VERSION=$(docker images --no-trunc | grep $EXEC_IMAGE_ID | grep -v latest | tr -s ' ' | cut -d ' ' -f 2 | tr "\n" ' ') + if [ -n "$EXEC_VERSION" ] ; then + echo "weave exec $EXEC_VERSION" else - echo "weave tools (unreleased version)" + echo "weave exec (unreleased version)" fi fi ;; run) [ $# -gt 0 ] || usage - if [ "$1" = "--with-dns" ] ; then - shift 1 - if [ \( "$DOCKER_VERSION_MAJOR" -lt 1 \) -o \ - \( "$DOCKER_VERSION_MAJOR" -eq 1 -a \ - "$DOCKER_VERSION_MINOR" -lt 2 \) ] ; then - echo "ERROR: The '--with-dns' option requires Docker 1.2.0 or later; you are running $DOCKER_VERSION" >&2 - exit 1 - fi - docker_bridge_ip - DNS_ARG="--dns $DOCKER_BRIDGE_IP" - DNS_SEARCH_ARG="--dns-search=." - for arg in "$@"; do - case $arg in - --dns-search=*) - DNS_SEARCH_ARG="" - ;; - *) - ;; - esac; - done + if [ "$LOCAL" = "--local" ]; then + dns_args "$@" + else + DNS_ARGS=$(exec_remote dns-args "$@") + [ "$1" = "--with-dns" ] && shift 1 fi CIDR=$1 - validate_cidr $CIDR shift 1 - create_bridge - CONTAINER=$(docker run $DNS_ARG $DNS_SEARCH_ARG -d "$@") - with_container_netns $CONTAINER attach $CIDR >/dev/null - tell_dns PUT $CONTAINER $CIDR + validate_cidr $CIDR + CONTAINER=$(docker run $DNS_ARGS -d "$@") + if [ "$LOCAL" = "--local" ]; then + create_bridge + with_container_netns $CONTAINER attach $CIDR >/dev/null + tell_dns PUT $CONTAINER $CIDR + else + exec_remote attach $CIDR $CONTAINER + fi echo $CONTAINER ;; + dns-args) + dns_args "$@" + echo -n $DNS_ARGS + ;; start) [ $# -eq 2 ] || usage CIDR=$1 @@ -673,7 +709,7 @@ case "$COMMAND" in echo "Weave is not running." >&2 fi docker rm -f $CONTAINER_NAME >/dev/null 2>&1 || true - run_tool host conntrack -D -p udp --dport $PORT >/dev/null 2>&1 || true + conntrack -D -p udp --dport $PORT >/dev/null 2>&1 || true ;; stop-dns) [ $# -eq 0 ] || usage @@ -688,7 +724,7 @@ case "$COMMAND" in docker kill $DNS_CONTAINER_NAME >/dev/null 2>&1 || true docker rm -f $CONTAINER_NAME >/dev/null 2>&1 || true docker rm -f $DNS_CONTAINER_NAME >/dev/null 2>&1 || true - run_tool host conntrack -D -p udp --dport $PORT >/dev/null 2>&1 || true + conntrack -D -p udp --dport $PORT >/dev/null 2>&1 || true destroy_bridge for LOCAL_IFNAME in $(ip link show | grep v${CONTAINER_IFNAME}pl | cut -d ' ' -f 2 | tr -d ':') ; do ip link del $LOCAL_IFNAME diff --git a/weaveexec/Dockerfile b/weaveexec/Dockerfile new file mode 100644 index 00000000..408b3a75 --- /dev/null +++ b/weaveexec/Dockerfile @@ -0,0 +1,8 @@ +FROM gliderlabs/alpine +MAINTAINER Weaveworks Inc +WORKDIR /home/weave +RUN ["apk", "add", "--update", "ethtool", "conntrack-tools", "curl", "iptables", "iproute2"] +RUN ["sh", "-c", "rm -rf /var/cache/apk/*"] +ADD ./weave /home/weave/ +ADD ./docker.tgz / +ENTRYPOINT ["/home/weave/weave"]