diff --git a/Makefile b/Makefile index 710a166c..c29af3ca 100644 --- a/Makefile +++ b/Makefile @@ -30,15 +30,17 @@ BUILD_UPTODATE=.build.uptodate WEAVER_UPTODATE=.weaver.uptodate WEAVEEXEC_UPTODATE=.weaveexec.uptodate PLUGIN_UPTODATE=.plugin.uptodate +WEAVEDB_UPTODATE=.weavedb.uptodate -IMAGES_UPTODATE=$(WEAVER_UPTODATE) $(WEAVEEXEC_UPTODATE) $(PLUGIN_UPTODATE) $(BUILD_UPTODATE) +IMAGES_UPTODATE=$(WEAVER_UPTODATE) $(WEAVEEXEC_UPTODATE) $(PLUGIN_UPTODATE) $(BUILD_UPTODATE) $(WEAVEDB_UPTODATE) WEAVER_IMAGE=$(DOCKERHUB_USER)/weave WEAVEEXEC_IMAGE=$(DOCKERHUB_USER)/weaveexec PLUGIN_IMAGE=$(DOCKERHUB_USER)/plugin BUILD_IMAGE=$(DOCKERHUB_USER)/weavebuild +WEAVEDB_IMAGE=$(DOCKERHUB_USER)/weavedb -IMAGES=$(WEAVER_IMAGE) $(WEAVEEXEC_IMAGE) $(PLUGIN_IMAGE) +IMAGES=$(WEAVER_IMAGE) $(WEAVEEXEC_IMAGE) $(PLUGIN_IMAGE) $(WEAVEDB_IMAGE) WEAVE_EXPORT=weave.tar.gz @@ -147,6 +149,10 @@ $(PLUGIN_UPTODATE): prog/plugin/Dockerfile $(PLUGIN_EXE) $(WEAVEEXEC_UPTODATE) $(SUDO) docker build -t $(PLUGIN_IMAGE) prog/plugin touch $@ +$(WEAVEDB_UPTODATE): prog/weavedb/Dockerfile + $(SUDO) docker build -t $(WEAVEDB_IMAGE) prog/weavedb + touch $@ + $(WEAVE_EXPORT): $(IMAGES_UPTODATE) $(SUDO) DOCKER_HOST=$(DOCKER_HOST) docker save $(addsuffix :latest,$(IMAGES)) | gzip > $@ diff --git a/prog/weavedb/Dockerfile b/prog/weavedb/Dockerfile new file mode 100644 index 00000000..6c3e468b --- /dev/null +++ b/prog/weavedb/Dockerfile @@ -0,0 +1,6 @@ +# This is a nearly-empty image that we use to create a data-only container for persistence +FROM scratch +MAINTAINER Weaveworks Inc +ENTRYPOINT ["data-only"] +# Work round Docker refusing to save an empty image +COPY Dockerfile / diff --git a/prog/weaver/Dockerfile b/prog/weaver/Dockerfile index 2e8e86de..9fe7f36e 100644 --- a/prog/weaver/Dockerfile +++ b/prog/weaver/Dockerfile @@ -3,5 +3,6 @@ MAINTAINER Weaveworks Inc LABEL works.weave.role=system WORKDIR /home/weave ADD ./weaver /home/weave/ +ADD weavedata.db /weavedb/ COPY ca-certificates.crt /etc/ssl/certs/ ENTRYPOINT ["/home/weave/weaver"] diff --git a/prog/weaver/main.go b/prog/weaver/main.go index 2f6a86b4..f575f91d 100644 --- a/prog/weaver/main.go +++ b/prog/weaver/main.go @@ -166,7 +166,7 @@ func main() { mflag.StringVar(&dnsConfig.EffectiveListenAddress, []string{"-dns-effective-listen-address"}, "", "address DNS will actually be listening, after Docker port mapping") mflag.StringVar(&datapathName, []string{"-datapath"}, "", "ODP datapath name") mflag.StringVar(&trustedSubnetStr, []string{"-trusted-subnets"}, "", "comma-separated list of trusted subnets in CIDR notation") - mflag.StringVar(&dbPrefix, []string{"-db-prefix"}, "weave", "pathname/prefix of filename to store data") + mflag.StringVar(&dbPrefix, []string{"-db-prefix"}, "/weavedb/weave", "pathname/prefix of filename to store data") // crude way of detecting that we probably have been started in a // container, with `weave launch` --> suppress misleading paths in diff --git a/prog/weaver/weavedata.db b/prog/weaver/weavedata.db new file mode 100644 index 00000000..e69de29b diff --git a/test/370_persist_ipam_2_test.sh b/test/370_persist_ipam_2_test.sh index 15b2f330..d4bc5ef3 100755 --- a/test/370_persist_ipam_2_test.sh +++ b/test/370_persist_ipam_2_test.sh @@ -7,13 +7,9 @@ start_suite "Checking persistence of IPAM" launch_router_with_db() { host=$1 shift - WEAVE_DOCKER_ARGS="-v /tmp:/db" weave_on $host launch-router --db-prefix=/db/test162- "$@" + weave_on $host launch-router "$@" } -# Remove any persisted data from previous runs -run_on $HOST1 "sudo rm -f /tmp/test162-*" -run_on $HOST2 "sudo rm -f /tmp/test162-*" - launch_router_with_db $HOST1 $HOST2 launch_router_with_db $HOST2 $HOST1 diff --git a/weave b/weave index 964a666a..fc021d1e 100755 --- a/weave +++ b/weave @@ -21,6 +21,7 @@ MIN_DOCKER_VERSION=1.6.0 DOCKERHUB_USER=${DOCKERHUB_USER:-weaveworks} BASE_EXEC_IMAGE=$DOCKERHUB_USER/weaveexec EXEC_IMAGE=$BASE_EXEC_IMAGE:$IMAGE_VERSION +WEAVEDB_IMAGE=$DOCKERHUB_USER/weavedb PROXY_HOST=${PROXY_HOST:-$(echo "${DOCKER_HOST#tcp://}" | cut -s -d: -f1)} PROXY_HOST=${PROXY_HOST:-127.0.0.1} DOCKER_CLIENT_HOST=${DOCKER_CLIENT_HOST:-$DOCKER_HOST} @@ -384,7 +385,10 @@ IMAGE=$BASE_IMAGE:$IMAGE_VERSION BASE_PLUGIN_IMAGE=$DOCKERHUB_USER/plugin PLUGIN_IMAGE=$BASE_PLUGIN_IMAGE:$IMAGE_VERSION PLUGIN_CONTAINER_NAME=weaveplugin +# Note VOLUMES_CONTAINER which is for weavewait should change when you upgrade Weave VOLUMES_CONTAINER_NAME=weavevolumes-$IMAGE_VERSION +# DB files should remain when you upgrade, so version number not included in name +DB_CONTAINER_NAME=weavedb DOCKER_BRIDGE=${DOCKER_BRIDGE:-docker0} CONTAINER_NAME=${WEAVE_CONTAINER_NAME:-weave} @@ -1679,12 +1683,19 @@ launch_router() { fi fi + # Create a data-only container for persistence data + if ! docker inspect -f ' ' $DB_CONTAINER_NAME > /dev/null 2>&1 ; then + docker create -v /weavedb --name=$DB_CONTAINER_NAME \ + --label=weavevolumes $WEAVEDB_IMAGE >/dev/null + fi + # Set WEAVE_DOCKER_ARGS in the environment in order to supply # additional parameters, such as resource limits, to docker # when launching the weave container. start_if_necessary router $CONTAINER_NAME $IMAGE \ $(docker_run_options) \ --restart=always \ + --volumes-from $DB_CONTAINER_NAME \ -e WEAVE_PASSWORD \ -e CHECKPOINT_DISABLE \ $WEAVE_DOCKER_ARGS $IMAGE $COVERAGE_ARGS \