diff --git a/Makefile b/Makefile index 7be13758..b91dca33 100644 --- a/Makefile +++ b/Makefile @@ -135,9 +135,6 @@ PUSH_ML=push_ml_weave push_ml_weaveexec push_ml_weave-kube push_ml_weave-npc WEAVE_EXPORT=weave$(ARCH_EXT).tar.gz -DOCKER_VERSION=1.10.3 -DOCKER_DISTRIB=prog/weaveexec/docker-$(DOCKER_VERSION).tgz -DOCKER_DISTRIB_URL=https://get.docker.com/builds/Linux/$(WEAVEEXEC_DOCKER_ARCH)/docker-$(DOCKER_VERSION).tgz NETGO_CHECK=@strings $@ | grep cgo_stub\\\.go >/dev/null || { \ rm $@; \ echo "\nYour go standard library was built without the 'netgo' build tag."; \ @@ -260,13 +257,11 @@ $(WEAVER_UPTODATE): prog/weaver/Dockerfile.$(DOCKERHUB_USER) $(WEAVER_EXE) weave $(SUDO) DOCKER_HOST=$(DOCKER_HOST) docker build -f prog/weaver/Dockerfile.$(DOCKERHUB_USER) -t $(WEAVER_IMAGE) prog/weaver touch $@ -$(WEAVEEXEC_UPTODATE): prog/weaveexec/Dockerfile.$(DOCKERHUB_USER) prog/weaveexec/symlink $(DOCKER_DISTRIB) $(SIGPROXY_EXE) $(WEAVEWAIT_EXE) $(WEAVEWAIT_NOOP_EXE) $(WEAVEWAIT_NOMCAST_EXE) $(WEAVER_UPTODATE) +$(WEAVEEXEC_UPTODATE): prog/weaveexec/Dockerfile.$(DOCKERHUB_USER) prog/weaveexec/symlink $(SIGPROXY_EXE) $(WEAVEWAIT_EXE) $(WEAVEWAIT_NOOP_EXE) $(WEAVEWAIT_NOMCAST_EXE) $(WEAVER_UPTODATE) cp $(SIGPROXY_EXE) prog/weaveexec/sigproxy cp $(WEAVEWAIT_EXE) prog/weaveexec/weavewait cp $(WEAVEWAIT_NOOP_EXE) prog/weaveexec/weavewait_noop cp $(WEAVEWAIT_NOMCAST_EXE) prog/weaveexec/weavewait_nomcast - tar -xf $(DOCKER_DISTRIB) usr/local/bin/docker -O > prog/weaveexec/docker - chmod +x prog/weaveexec/docker $(SUDO) DOCKER_HOST=$(DOCKER_HOST) docker build -f prog/weaveexec/Dockerfile.$(DOCKERHUB_USER) -t $(WEAVEEXEC_IMAGE) prog/weaveexec touch $@ @@ -307,10 +302,6 @@ $(NETWORKTESTER_UPTODATE): test/images/network-tester/Dockerfile $(NETWORKTESTER $(WEAVE_EXPORT): $(IMAGES_UPTODATE) $(WEAVEDB_UPTODATE) $(SUDO) DOCKER_HOST=$(DOCKER_HOST) docker save $(addsuffix :latest,$(IMAGES)) | gzip > $@ -$(DOCKER_DISTRIB): - curl -o $(DOCKER_DISTRIB) $(DOCKER_DISTRIB_URL) - cd $(shell dirname $@) && sha256sum -c $(shell pwd)/build/shasums/docker-tgz-$(WEAVEEXEC_DOCKER_ARCH).sha256sum - tools/.git $(MANIFEST_TOOL_DIR)/.git: git submodule update --init @@ -383,7 +374,7 @@ clean-bin: -$(SUDO) DOCKER_HOST=$(DOCKER_HOST) docker rmi $(IMAGES) find prog -type f -name "Dockerfile.*" -not -name "Dockerfile.template" -print | xargs rm -f find prog -type f -name "*qemu-*" -print | xargs rm -f - rm -rf $(EXES) $(IMAGES_UPTODATE) $(WEAVEDB_UPTODATE) weave*.tar.gz $(DOCKER_DISTRIB) prog/weaveexec/docker .pkg + rm -rf $(EXES) $(IMAGES_UPTODATE) $(WEAVEDB_UPTODATE) weave*.tar.gz .pkg clean: clean-bin clean-work-dir -$(SUDO) DOCKER_HOST=$(DOCKER_HOST) docker rmi $(BUILD_IMAGE) diff --git a/build/shasums/docker-tgz-armel.sha256sum b/build/shasums/docker-tgz-armel.sha256sum deleted file mode 100644 index 49fdca83..00000000 --- a/build/shasums/docker-tgz-armel.sha256sum +++ /dev/null @@ -1 +0,0 @@ -8f313a9df867c207ae9ceac6e0935d1d2a0360aafce780dd5d1e0687ee98e0c3 docker-1.10.3.tgz diff --git a/build/shasums/docker-tgz-x86_64.sha256sum b/build/shasums/docker-tgz-x86_64.sha256sum deleted file mode 100644 index 330e1425..00000000 --- a/build/shasums/docker-tgz-x86_64.sha256sum +++ /dev/null @@ -1 +0,0 @@ -7541b5490cee1183d911f909c0e91d3d9d57b2b775e40f14a1a7a6de216ca4a8 docker-1.10.3.tgz diff --git a/prog/weaveexec/Dockerfile.template b/prog/weaveexec/Dockerfile.template index 1f9e8bd6..e0e66436 100644 --- a/prog/weaveexec/Dockerfile.template +++ b/prog/weaveexec/Dockerfile.template @@ -3,7 +3,6 @@ FROM DOCKERHUB_USER/weaveARCH_EXT ENTRYPOINT ["/home/weave/sigproxy", "/home/weave/weave"] ADD ./sigproxy ./symlink /home/weave/ -ADD ./docker /usr/bin/ ADD ./weavewait /w/w ADD ./weavewait_noop /w-noop/w ADD ./weavewait_nomcast /w-nomcast/w diff --git a/prog/weaveutil/attach.go b/prog/weaveutil/attach.go index d1f636b2..8ffce5f2 100644 --- a/prog/weaveutil/attach.go +++ b/prog/weaveutil/attach.go @@ -8,7 +8,6 @@ import ( "strings" "syscall" - docker "github.com/fsouza/go-dockerclient" "github.com/vishvananda/netns" weavenet "github.com/weaveworks/weave/net" @@ -70,21 +69,6 @@ func attach(args []string) error { return err } -func containerPid(containerID string) (int, error) { - c, err := docker.NewVersionedClientFromEnv("1.18") - if err != nil { - return 0, fmt.Errorf("unable to connect to docker: %s", err) - } - container, err := c.InspectContainer(containerID) - if err != nil { - return 0, fmt.Errorf("unable to inspect container %s: %s", containerID, err) - } - if container.State.Pid == 0 { - return 0, fmt.Errorf("container %s not running", containerID) - } - return container.State.Pid, nil -} - func processExists(pid int) bool { err := syscall.Kill(pid, syscall.Signal(0)) return err == nil || err == syscall.EPERM @@ -119,21 +103,31 @@ func detach(args []string) error { } func rewriteEtcHosts(args []string) error { - if len(args) < 4 { - cmdUsage("rewrite-etc-hosts", " ... [name:addr...]") + if len(args) < 3 { + cmdUsage("rewrite-etc-hosts", " [name:addr...]") } - hostsPath := args[0] - fqdn := args[1] - image := args[2] + containerID := args[0] + image := args[1] + cidrs := args[2] + extraHosts := args[3:] + + container, err := inspectContainer(containerID) + if err != nil { + return err + } + + hostsPath := container.HostsPath + fqdn := container.Config.Hostname + "." + container.Config.Domainname + var ips []*net.IPNet - for _, cidr := range strings.Fields(args[3]) { + for _, cidr := range strings.Fields(cidrs) { _, ipnet, err := net.ParseCIDR(cidr) if err != nil { return err } ips = append(ips, ipnet) } - extraHosts := args[4:] + docker := os.Getenv("DOCKER_HOST") if docker == "" { docker = "unix:///var/run/docker.sock" diff --git a/prog/weaveutil/container.go b/prog/weaveutil/container.go new file mode 100644 index 00000000..cbbc5622 --- /dev/null +++ b/prog/weaveutil/container.go @@ -0,0 +1,285 @@ +package main + +import ( + "fmt" + "os" + "strings" + + docker "github.com/fsouza/go-dockerclient" +) + +func inspectContainer(containerNameOrID string) (*docker.Container, error) { + c, err := docker.NewVersionedClientFromEnv("1.18") + if err != nil { + return nil, fmt.Errorf("unable to connect to docker: %s", err) + } + + container, err := c.InspectContainer(containerNameOrID) + if err != nil { + return nil, fmt.Errorf("unable to inspect container %s: %s", containerNameOrID, err) + } + return container, nil +} + +func containerPid(containerID string) (int, error) { + container, err := inspectContainer(containerID) + if err != nil { + return 0, err + + } + + if container.State.Pid == 0 { + return 0, fmt.Errorf("container %s not running", containerID) + } + return container.State.Pid, nil +} + +func containerID(args []string) error { + if len(args) < 1 { + cmdUsage("container-id", "") + } + + container, err := inspectContainer(args[0]) + if err != nil { + return err + } + + fmt.Print(container.ID) + return nil +} + +func containerState(args []string) error { + if len(args) < 1 { + cmdUsage("container-state", " []") + } + + container, err := inspectContainer(args[0]) + if err != nil { + return err + } + + if len(args) == 1 { + fmt.Print(container.State.StateString()) + } else { + imagePrefix := args[1] + if strings.HasPrefix(container.Config.Image, imagePrefix) { + fmt.Print(container.State.StateString()) + } else { + if container.State.Running { + fmt.Print("running image mismatch: ", container.Config.Image) + } else { + fmt.Print("image mismatch: ", container.Config.Image) + } + } + } + return nil +} + +func containerFQDN(args []string) error { + if len(args) < 1 { + cmdUsage("container-fqdn", "") + } + + container, err := inspectContainer(args[0]) + if err != nil { + return err + } + + fmt.Print(container.Config.Hostname, ".", container.Config.Domainname) + return nil +} + +func runContainer(args []string) error { + env := []string{} + name := "" + net := "" + pid := "" + privileged := false + restart := docker.NeverRestart() + volumes := []string{} + volumesFrom := []string{} + + done := false + for i := 0; i < len(args) && !done; { + switch args[i] { + case "-e", "--env": + if v := os.Getenv(args[i+1]); v != "" { + env = append(env, args[i+1]+"="+v) + } else { + env = append(env, args[i+1]) + } + args = append(args[:i], args[i+2:]...) + case "--name": + name = args[i+1] + args = append(args[:i], args[i+2:]...) + case "--net": + net = args[i+1] + args = append(args[:i], args[i+2:]...) + case "--pid": + pid = args[i+1] + args = append(args[:i], args[i+2:]...) + case "--privileged": + privileged = true + args = append(args[:i], args[i+1:]...) + case "--restart": + restart = docker.RestartPolicy{Name: args[i+1]} + args = append(args[:i], args[i+2:]...) + case "-v", "--volume": + // Must dedup binds, otherwise, container fails creation + skip := false + for _, v := range volumes { + if v == args[i+1] { + skip = true + } + } + if !skip { + volumes = append(volumes, args[i+1]) + } + args = append(args[:i], args[i+2:]...) + case "--volumes-from": + volumesFrom = append(volumesFrom, args[i+1]) + args = append(args[:i], args[i+2:]...) + default: + done = true + } + } + + if len(args) < 2 { + cmdUsage("run-container", `[options] [[] [ ...]] + + -e, --env list Set environment variables + --name string Assign a name to the container + --net string Network Mode + --pid string PID namespace to use + --privileged Give extended privileges to this container + --restart string Restart policy to apply when a container exits (default "no") + -v, --volume list Bind mount a volume + --volumes-from list Mount volumes from the specified container(s) +`) + } + + image := args[0] + cmds := args[1:] + + c, err := docker.NewVersionedClientFromEnv("1.18") + if err != nil { + return fmt.Errorf("unable to connect to docker: %s", err) + } + + config := docker.Config{Image: image, Env: env, Cmd: cmds} + hostConfig := docker.HostConfig{NetworkMode: net, PidMode: pid, Privileged: privileged, RestartPolicy: restart, Binds: volumes, VolumesFrom: volumesFrom} + container, err := c.CreateContainer(docker.CreateContainerOptions{Name: name, Config: &config, HostConfig: &hostConfig}) + if err != nil { + return fmt.Errorf("unable to create container: %s", err) + } + + err = c.StartContainer(container.ID, &hostConfig) + if err != nil { + return fmt.Errorf("unable to start container: %s", err) + } + + fmt.Print(container.ID) + return nil +} + +func listContainers(args []string) error { + if len(args) > 1 { + cmdUsage("list-containers", "[