From 19f2b26c4cb1baf991cdca535370dd55516cb1e2b477329366b54e4a3f4ccc02 Mon Sep 17 00:00:00 2001 From: Jordi Massaguer Date: Fri, 5 Feb 2016 11:01:39 +0000 Subject: [PATCH] restore fix-docker-init.patch since docker-init has been removed in master branch, but not in this 1.10.0 version OBS-URL: https://build.opensuse.org/package/show/Virtualization:containers/docker?expand=0&rev=60 --- docker.spec | 2 + fix-docker-init.patch | 10 + remove_docker_init.patch | 1182 ++++++++++++++++++++++++++++++++++++++ 3 files changed, 1194 insertions(+) create mode 100644 fix-docker-init.patch create mode 100644 remove_docker_init.patch diff --git a/docker.spec b/docker.spec index 250ee91..604570f 100644 --- a/docker.spec +++ b/docker.spec @@ -43,6 +43,7 @@ Source8: docker-audit.rules Source100: sysconfig.docker.ppc64le Patch0: fix_platform_type_arm.patch Patch1: gcc5_socket_workaround.patch +Patch2: fix-docker-init.patch Patch100: gcc-go-patches.patch Patch101: fix-ppc64le.patch BuildRequires: audit @@ -148,6 +149,7 @@ Test package for docker. It contains the source code and the tests. %if 0%{?suse_version} >= 1330 && 0%{?is_opensuse} == 1 %patch1 -p1 %endif +%patch2 -p1 %ifnarch %go_arches %patch100 -p1 %patch101 -p1 diff --git a/fix-docker-init.patch b/fix-docker-init.patch new file mode 100644 index 0000000..d20346b --- /dev/null +++ b/fix-docker-init.patch @@ -0,0 +1,10 @@ +diff -Naur a/hack/make/.dockerinit b/hack/make/.dockerinit +--- a/hack/make/.dockerinit 2015-08-11 18:35:27.000000000 +0200 ++++ b/hack/make/.dockerinit 2015-08-12 18:14:25.743452565 +0200 +@@ -29,5 +29,6 @@ + exit 1 + fi + ++/usr/bin/strip -s $DEST/dockerinit-$VERSION + # sha1 our new dockerinit to ensure separate docker and dockerinit always run in a perfect pair compiled for one another + export DOCKER_INITSHA1=$($sha1sum "$DEST/dockerinit-$VERSION" | cut -d' ' -f1) diff --git a/remove_docker_init.patch b/remove_docker_init.patch new file mode 100644 index 0000000..523018e --- /dev/null +++ b/remove_docker_init.patch @@ -0,0 +1,1182 @@ +From 4357ed4a7363a1032edf93cf03232953c805184f Mon Sep 17 00:00:00 2001 +From: Aleksa Sarai +Date: Wed, 20 Jan 2016 22:53:54 +1100 +Subject: [PATCH 1/3] *: purge dockerinit from source code + +dockerinit has been around for a very long time. It was originally used +as a way for us to do configuration for LXC containers once the +container had started. LXC is no longer supported, and /.dockerinit has +been dead code for quite a while. This removes all code and references +in code to dockerinit. + +Signed-off-by: Aleksa Sarai +--- + Dockerfile | 5 +- + Dockerfile.armhf | 3 +- + Dockerfile.gccgo | 3 +- + api/client/info.go | 2 - + container/container_unix.go | 4 -- + contrib/builder/rpm/generate.sh | 4 +- + daemon/container_operations_unix.go | 1 - + daemon/container_operations_windows.go | 1 - + daemon/daemon_unix.go | 4 +- + daemon/execdriver/driver.go | 1 - + daemon/info.go | 7 --- + dockerinit/dockerinit.go | 11 ---- + dockerversion/version_lib.go | 3 - + hack/.vendor-helpers.sh | 1 - + hack/make.sh | 1 - + hack/make/.build-deb/rules | 4 +- + hack/make/.build-rpm/docker-engine.spec | 10 --- + hack/make/.dockerinit | 33 ---------- + hack/make/.dockerinit-gccgo | 31 --------- + hack/make/.go-autogen | 9 +-- + hack/make/dynbinary | 10 --- + hack/make/dyngccgo | 10 --- + integration-cli/docker_cli_diff_test.go | 6 +- + pkg/mount/mountinfo_linux_test.go | 1 - + utils/utils.go | 107 -------------------------------- + 25 files changed, 13 insertions(+), 259 deletions(-) + delete mode 100644 dockerinit/dockerinit.go + delete mode 100644 hack/make/.dockerinit + delete mode 100644 hack/make/.dockerinit-gccgo + +diff --git a/Dockerfile b/Dockerfile +index 56da7fe..71d5017 100644 +--- a/Dockerfile ++++ b/Dockerfile +@@ -96,8 +96,7 @@ RUN set -x \ + ENV PATH /osxcross/target/bin:$PATH + + # install seccomp +-# this can be changed to the ubuntu package libseccomp-dev if dockerinit is removed, +-# we need libseccomp.a (which the package does not provide) for dockerinit ++# TODO: switch to libseccomp-dev since dockerinit is gone + ENV SECCOMP_VERSION 2.2.3 + RUN set -x \ + && export SECCOMP_PATH="$(mktemp -d)" \ +@@ -114,7 +113,7 @@ RUN set -x \ + + # Install Go + # IMPORTANT: If the version of Go is updated, the Windows to Linux CI machines +-# will need updating, to avoid errors. Ping #docker-maintainers on IRC ++# will need updating, to avoid errors. Ping #docker-maintainers on IRC + # with a heads-up. + ENV GO_VERSION 1.5.3 + RUN curl -fsSL "https://storage.googleapis.com/golang/go${GO_VERSION}.linux-amd64.tar.gz" \ +diff --git a/Dockerfile.armhf b/Dockerfile.armhf +index 3239edb..1bef8ec 100644 +--- a/Dockerfile.armhf ++++ b/Dockerfile.armhf +@@ -111,8 +111,7 @@ RUN git clone https://github.com/golang/lint.git /go/src/github.com/golang/lint + && go install -v github.com/golang/lint/golint + + # install seccomp +-# this can be changed to the ubuntu package libseccomp-dev if dockerinit is removed, +-# we need libseccomp.a (which the package does not provide) for dockerinit ++# TODO: switch to libseccomp-dev since dockerinit is gone + ENV SECCOMP_VERSION 2.2.3 + RUN set -x \ + && export SECCOMP_PATH="$(mktemp -d)" \ +diff --git a/Dockerfile.gccgo b/Dockerfile.gccgo +index 6d184f0..856489d 100644 +--- a/Dockerfile.gccgo ++++ b/Dockerfile.gccgo +@@ -42,8 +42,7 @@ RUN cd /usr/local/lvm2 \ + # see https://git.fedorahosted.org/cgit/lvm2.git/tree/INSTALL + + # install seccomp +-# this can be changed to the ubuntu package libseccomp-dev if dockerinit is removed, +-# we need libseccomp.a (which the package does not provide) for dockerinit ++# TODO: switch to libseccomp-dev since dockerinit is gone + ENV SECCOMP_VERSION v2.2.3 + RUN set -x \ + && export SECCOMP_PATH=$(mktemp -d) \ +diff --git a/api/client/info.go b/api/client/info.go +index 42f0682..4c61633 100644 +--- a/api/client/info.go ++++ b/api/client/info.go +@@ -74,8 +74,6 @@ func (cli *DockerCli) CmdInfo(args ...string) error { + fmt.Fprintf(cli.out, " Goroutines: %d\n", info.NGoroutines) + fmt.Fprintf(cli.out, " System Time: %s\n", info.SystemTime) + fmt.Fprintf(cli.out, " EventsListeners: %d\n", info.NEventsListener) +- fmt.Fprintf(cli.out, " Init SHA1: %s\n", info.InitSha1) +- fmt.Fprintf(cli.out, " Init Path: %s\n", info.InitPath) + fmt.Fprintf(cli.out, " Docker Root Dir: %s\n", info.DockerRootDir) + } + +diff --git a/container/container_unix.go b/container/container_unix.go +index 9510a24..3db1444 100644 +--- a/container/container_unix.go ++++ b/container/container_unix.go +@@ -63,10 +63,6 @@ func (container *Container) CreateDaemonEnvironment(linkedEnv []string) []string + env := []string{ + "PATH=" + system.DefaultPathEnv, + "HOSTNAME=" + fullHostname, +- // Note: we don't set HOME here because it'll get autoset intelligently +- // based on the value of USER inside dockerinit, but only if it isn't +- // set already (ie, that can be overridden by setting HOME via -e or ENV +- // in a Dockerfile). + } + if container.Config.Tty { + env = append(env, "TERM=xterm") +diff --git a/contrib/builder/rpm/generate.sh b/contrib/builder/rpm/generate.sh +index 323502c..00749b0 100755 +--- a/contrib/builder/rpm/generate.sh ++++ b/contrib/builder/rpm/generate.sh +@@ -118,9 +118,7 @@ for version in "${versions[@]}"; do + + echo >> "$version/Dockerfile" + +- # fedora does not have a libseccomp.a for compiling static dockerinit +- # ONLY install libseccomp.a from source, this can be removed once dockerinit is removed +- # TODO remove this manual seccomp compilation once dockerinit is gone or no longer needs to be statically compiled ++ # TODO remove this since dockerinit is finally gone + case "$from" in + fedora:*) + awk '$1 == "ENV" && $2 == "SECCOMP_VERSION" { print; exit }' ../../../Dockerfile >> "$version/Dockerfile" +diff --git a/daemon/container_operations_unix.go b/daemon/container_operations_unix.go +index 0449613..8eaedcc 100644 +--- a/daemon/container_operations_unix.go ++++ b/daemon/container_operations_unix.go +@@ -254,7 +254,6 @@ func (daemon *Daemon) populateCommand(c *container.Container, env []string) erro + c.Command = &execdriver.Command{ + CommonCommand: execdriver.CommonCommand{ + ID: c.ID, +- InitPath: "/.dockerinit", + MountLabel: c.GetMountLabel(), + Network: en, + ProcessConfig: processConfig, +diff --git a/daemon/container_operations_windows.go b/daemon/container_operations_windows.go +index 23bc645..b812bfc 100644 +--- a/daemon/container_operations_windows.go ++++ b/daemon/container_operations_windows.go +@@ -124,7 +124,6 @@ func (daemon *Daemon) populateCommand(c *container.Container, env []string) erro + CommonCommand: execdriver.CommonCommand{ + ID: c.ID, + Rootfs: c.BaseFS, +- InitPath: "/.dockerinit", + WorkingDir: c.Config.WorkingDir, + Network: en, + MountLabel: c.GetMountLabel(), +diff --git a/daemon/daemon_unix.go b/daemon/daemon_unix.go +index 8f948e0..11dc7c7 100644 +--- a/daemon/daemon_unix.go ++++ b/daemon/daemon_unix.go +@@ -688,8 +688,7 @@ func initBridgeDriver(controller libnetwork.NetworkController, config *Config) e + } + + // setupInitLayer populates a directory with mountpoints suitable +-// for bind-mounting dockerinit into the container. The mountpoint is simply an +-// empty file at /.dockerinit ++// for bind-mounting things into the container. + // + // This extra layer is used by all containers as the top-most ro layer. It protects + // the container from unwanted side-effects on the rw layer. +@@ -699,7 +698,6 @@ func setupInitLayer(initLayer string, rootUID, rootGID int) error { + "/dev/shm": "dir", + "/proc": "dir", + "/sys": "dir", +- "/.dockerinit": "file", + "/.dockerenv": "file", + "/etc/resolv.conf": "file", + "/etc/hosts": "file", +diff --git a/daemon/execdriver/driver.go b/daemon/execdriver/driver.go +index 465e038..ba47b74 100644 +--- a/daemon/execdriver/driver.go ++++ b/daemon/execdriver/driver.go +@@ -131,7 +131,6 @@ type CommonProcessConfig struct { + type CommonCommand struct { + ContainerPid int `json:"container_pid"` // the pid for the process inside a container + ID string `json:"id"` +- InitPath string `json:"initpath"` // dockerinit + MountLabel string `json:"mount_label"` // TODO Windows. More involved, but can be factored out + Mounts []Mount `json:"mounts"` + Network *Network `json:"network"` +diff --git a/daemon/info.go b/daemon/info.go +index 008ac20..20d8356 100644 +--- a/daemon/info.go ++++ b/daemon/info.go +@@ -49,11 +49,6 @@ func (daemon *Daemon) SystemInfo() (*types.Info, error) { + logrus.Errorf("Could not read system memory info: %v", err) + } + +- // if we still have the original dockerinit binary from before +- // we copied it locally, let's return the path to that, since +- // that's more intuitive (the copied path is trivial to derive +- // by hand given VERSION) +- initPath := utils.DockerInitPath("") + sysInfo := sysinfo.New(true) + + var cRunning, cPaused, cStopped int32 +@@ -94,8 +89,6 @@ func (daemon *Daemon) SystemInfo() (*types.Info, error) { + OSType: platform.OSType, + Architecture: platform.Architecture, + RegistryConfig: daemon.RegistryService.Config, +- InitSha1: dockerversion.InitSHA1, +- InitPath: initPath, + NCPU: runtime.NumCPU(), + MemTotal: meminfo.MemTotal, + DockerRootDir: daemon.configStore.Root, +diff --git a/dockerinit/dockerinit.go b/dockerinit/dockerinit.go +deleted file mode 100644 +index 8a0be56..0000000 +--- a/dockerinit/dockerinit.go ++++ /dev/null +@@ -1,11 +0,0 @@ +-package main +- +-import ( +- _ "github.com/docker/docker/daemon/execdriver/native" +- "github.com/docker/docker/pkg/reexec" +-) +- +-func main() { +- // Running in init mode +- reexec.Init() +-} +diff --git a/dockerversion/version_lib.go b/dockerversion/version_lib.go +index 1d5862d..6644bce 100644 +--- a/dockerversion/version_lib.go ++++ b/dockerversion/version_lib.go +@@ -9,8 +9,5 @@ const ( + GitCommit string = "library-import" + Version string = "library-import" + BuildTime string = "library-import" +- + IAmStatic string = "library-import" +- InitSHA1 string = "library-import" +- InitPath string = "library-import" + ) +diff --git a/hack/.vendor-helpers.sh b/hack/.vendor-helpers.sh +index e3be72b..fcc745c 100755 +--- a/hack/.vendor-helpers.sh ++++ b/hack/.vendor-helpers.sh +@@ -76,7 +76,6 @@ _dockerfile_env() { + clean() { + local packages=( + "${PROJECT}/docker" # package main +- "${PROJECT}/dockerinit" # package main + "${PROJECT}/integration-cli" # external tests + ) + local dockerPlatforms=( ${DOCKER_ENGINE_OSARCH:="linux/amd64"} $(_dockerfile_env DOCKER_CROSSPLATFORMS) ) +diff --git a/hack/make.sh b/hack/make.sh +index dc6cffa..6e007cc 100755 +--- a/hack/make.sh ++++ b/hack/make.sh +@@ -237,7 +237,6 @@ test_env() { + HOME="$ABS_DEST/fake-HOME" \ + PATH="$PATH" \ + TEMP="$TEMP" \ +- TEST_DOCKERINIT_PATH="$TEST_DOCKERINIT_PATH" \ + "$@" + } + +diff --git a/hack/make/.build-deb/rules b/hack/make/.build-deb/rules +index 2c7f6c4..8928215 100755 +--- a/hack/make/.build-deb/rules ++++ b/hack/make/.build-deb/rules +@@ -17,14 +17,12 @@ override_dh_auto_test: + ./bundles/$(VERSION)/dynbinary/docker -v + + override_dh_strip: +- # the SHA1 of dockerinit is important: don't strip it +- # also, Go has lots of problems with stripping, so just don't ++ # Go has lots of problems with stripping, so just don't + + override_dh_auto_install: + mkdir -p debian/docker-engine/usr/bin + cp -aT "$$(readlink -f bundles/$(VERSION)/dynbinary/docker)" debian/docker-engine/usr/bin/docker + mkdir -p debian/docker-engine/usr/lib/docker +- cp -aT "$$(readlink -f bundles/$(VERSION)/dynbinary/dockerinit)" debian/docker-engine/usr/lib/docker/dockerinit + + override_dh_installinit: + # use "docker" as our service name, not "docker-engine" +diff --git a/hack/make/.build-rpm/docker-engine.spec b/hack/make/.build-rpm/docker-engine.spec +index 2fc1406..53b7cd7 100644 +--- a/hack/make/.build-rpm/docker-engine.spec ++++ b/hack/make/.build-rpm/docker-engine.spec +@@ -11,11 +11,6 @@ URL: https://dockerproject.org + Vendor: Docker + Packager: Docker + +-# docker builds in a checksum of dockerinit into docker, +-# # so stripping the binaries breaks docker +-%global __os_install_post %{_rpmconfigdir}/brp-compress +-%global debug_package %{nil} +- + # is_systemd conditional + %if 0%{?fedora} >= 21 || 0%{?centos} >= 7 || 0%{?rhel} >= 7 || 0%{?suse_version} >= 1300 + %global is_systemd 1 +@@ -124,10 +119,6 @@ export DOCKER_GITCOMMIT=%{_gitcommit} + install -d $RPM_BUILD_ROOT/%{_bindir} + install -p -m 755 bundles/%{_origversion}/dynbinary/docker-%{_origversion} $RPM_BUILD_ROOT/%{_bindir}/docker + +-# install dockerinit +-install -d $RPM_BUILD_ROOT/%{_libexecdir}/docker +-install -p -m 755 bundles/%{_origversion}/dynbinary/dockerinit-%{_origversion} $RPM_BUILD_ROOT/%{_libexecdir}/docker/dockerinit +- + # install udev rules + install -d $RPM_BUILD_ROOT/%{_sysconfdir}/udev/rules.d + install -p -m 644 contrib/udev/80-docker.rules $RPM_BUILD_ROOT/%{_sysconfdir}/udev/rules.d/80-docker.rules +@@ -175,7 +166,6 @@ install -p -m 644 contrib/syntax/nano/Dockerfile.nanorc $RPM_BUILD_ROOT/usr/shar + %files + %doc AUTHORS CHANGELOG.md CONTRIBUTING.md LICENSE MAINTAINERS NOTICE README.md + /%{_bindir}/docker +-/%{_libexecdir}/docker/dockerinit + /%{_sysconfdir}/udev/rules.d/80-docker.rules + %if 0%{?is_systemd} + /%{_unitdir}/docker.service +diff --git a/hack/make/.dockerinit b/hack/make/.dockerinit +deleted file mode 100644 +index 4a62ee1..0000000 +--- a/hack/make/.dockerinit ++++ /dev/null +@@ -1,33 +0,0 @@ +-#!/bin/bash +-set -e +- +-IAMSTATIC="true" +-source "${MAKEDIR}/.go-autogen" +- +-# dockerinit still needs to be a static binary, even if docker is dynamic +-go build \ +- -o "$DEST/dockerinit-$VERSION" \ +- "${BUILDFLAGS[@]}" \ +- -ldflags " +- $LDFLAGS +- $LDFLAGS_STATIC +- -extldflags \"$EXTLDFLAGS_STATIC\" +- " \ +- ./dockerinit +- +-echo "Created binary: $DEST/dockerinit-$VERSION" +-ln -sf "dockerinit-$VERSION" "$DEST/dockerinit" +- +-sha1sum= +-if command -v sha1sum &> /dev/null; then +- sha1sum=sha1sum +-elif command -v shasum &> /dev/null; then +- # Mac OS X - why couldn't they just use the same command name and be happy? +- sha1sum=shasum +-else +- echo >&2 'error: cannot find sha1sum command or equivalent' +- exit 1 +-fi +- +-# sha1 our new dockerinit to ensure separate docker and dockerinit always run in a perfect pair compiled for one another +-export DOCKER_INITSHA1=$($sha1sum "$DEST/dockerinit-$VERSION" | cut -d' ' -f1) +diff --git a/hack/make/.dockerinit-gccgo b/hack/make/.dockerinit-gccgo +deleted file mode 100644 +index 3caa526..0000000 +--- a/hack/make/.dockerinit-gccgo ++++ /dev/null +@@ -1,31 +0,0 @@ +-#!/bin/bash +-set -e +- +-IAMSTATIC="true" +-source "${MAKEDIR}/.go-autogen" +- +-# dockerinit still needs to be a static binary, even if docker is dynamic +-go build --compiler=gccgo \ +- -o "$DEST/dockerinit-$VERSION" \ +- "${BUILDFLAGS[@]}" \ +- --gccgoflags " +- -g +- -Wl,--no-export-dynamic +- $EXTLDFLAGS_STATIC +- -lnetgo +- " \ +- ./dockerinit +- +-echo "Created binary: $DEST/dockerinit-$VERSION" +-ln -sf "dockerinit-$VERSION" "$DEST/dockerinit" +- +-sha1sum= +-if command -v sha1sum &> /dev/null; then +- sha1sum=sha1sum +-else +- echo >&2 'error: cannot find sha1sum command or equivalent' +- exit 1 +-fi +- +-# sha1 our new dockerinit to ensure separate docker and dockerinit always run in a perfect pair compiled for one another +-export DOCKER_INITSHA1=$($sha1sum "$DEST/dockerinit-$VERSION" | cut -d' ' -f1) +diff --git a/hack/make/.go-autogen b/hack/make/.go-autogen +index 71f8370..c8e13b4 100644 +--- a/hack/make/.go-autogen ++++ b/hack/make/.go-autogen +@@ -14,10 +14,7 @@ const ( + GitCommit string = "$GITCOMMIT" + Version string = "$VERSION" + BuildTime string = "$BUILDTIME" +- + IAmStatic string = "${IAMSTATIC:-true}" +- InitSHA1 string = "$DOCKER_INITSHA1" +- InitPath string = "$DOCKER_INITPATH" + ) + // AUTOGENERATED FILE; see $BASH_SOURCE + DVEOF +@@ -44,9 +41,9 @@ When make binary is run, the Dockerfile prepares the build environment by: + + make.sh invokes hack/make/.go-autogen to: + +- - Run rsrc to create a binary file (autogen/winresources/rsrc.syso) that +- contains the manifest and icon. This file is automatically picked up by +- 'go build', so no post-processing steps are required. The sources for ++ - Run rsrc to create a binary file (autogen/winresources/rsrc.syso) that ++ contains the manifest and icon. This file is automatically picked up by ++ 'go build', so no post-processing steps are required. The sources for + rsrc.syso are under hack/make/.resources-windows. + + */ +diff --git a/hack/make/dynbinary b/hack/make/dynbinary +index e5fc0be..1d1a8e3 100644 +--- a/hack/make/dynbinary ++++ b/hack/make/dynbinary +@@ -1,16 +1,6 @@ + #!/bin/bash + set -e + +-if [ -z "$DOCKER_CLIENTONLY" ]; then +- source "${MAKEDIR}/.dockerinit" +- +- hash_files "$DEST/dockerinit-$VERSION" +-else +- # DOCKER_CLIENTONLY must be truthy, so we don't need to bother with dockerinit :) +- export DOCKER_INITSHA1="" +-fi +-# DOCKER_INITSHA1 is exported so that other bundlescripts can easily access it later without recalculating it +- + ( + export IAMSTATIC="false" + export LDFLAGS_STATIC_DOCKER='' +diff --git a/hack/make/dyngccgo b/hack/make/dyngccgo +index 0747637..a9019e8 100644 +--- a/hack/make/dyngccgo ++++ b/hack/make/dyngccgo +@@ -1,16 +1,6 @@ + #!/bin/bash + set -e + +-if [ -z "$DOCKER_CLIENTONLY" ]; then +- source "${MAKEDIR}/.dockerinit-gccgo" +- +- hash_files "$DEST/dockerinit-$VERSION" +-else +- # DOCKER_CLIENTONLY must be truthy, so we don't need to bother with dockerinit :) +- export DOCKER_INITSHA1="" +-fi +-# DOCKER_INITSHA1 is exported so that other bundlescripts can easily access it later without recalculating it +- + ( + export IAMSTATIC="false" + export EXTLDFLAGS_STATIC='' +diff --git a/integration-cli/docker_cli_diff_test.go b/integration-cli/docker_cli_diff_test.go +index 4f29d36..e0d0914 100644 +--- a/integration-cli/docker_cli_diff_test.go ++++ b/integration-cli/docker_cli_diff_test.go +@@ -27,10 +27,10 @@ func (s *DockerSuite) TestDiffFilenameShownInOutput(c *check.C) { + } + + // test to ensure GH #3840 doesn't occur any more +-func (s *DockerSuite) TestDiffEnsureDockerinitFilesAreIgnored(c *check.C) { ++func (s *DockerSuite) TestDiffEnsureInitLayerFilesAreIgnored(c *check.C) { + testRequires(c, DaemonIsLinux) + // this is a list of files which shouldn't show up in `docker diff` +- dockerinitFiles := []string{"/etc/resolv.conf", "/etc/hostname", "/etc/hosts", "/.dockerinit", "/.dockerenv"} ++ initLayerFiles := []string{"/etc/resolv.conf", "/etc/hostname", "/etc/hosts", "/.dockerenv"} + containerCount := 5 + + // we might not run into this problem from the first run, so start a few containers +@@ -41,7 +41,7 @@ func (s *DockerSuite) TestDiffEnsureDockerinitFilesAreIgnored(c *check.C) { + cleanCID := strings.TrimSpace(out) + out, _ = dockerCmd(c, "diff", cleanCID) + +- for _, filename := range dockerinitFiles { ++ for _, filename := range initLayerFiles { + c.Assert(out, checker.Not(checker.Contains), filename) + } + } +diff --git a/pkg/mount/mountinfo_linux_test.go b/pkg/mount/mountinfo_linux_test.go +index 812d12e..bd100e1 100644 +--- a/pkg/mount/mountinfo_linux_test.go ++++ b/pkg/mount/mountinfo_linux_test.go +@@ -224,7 +224,6 @@ const ( + 43 16 0:34 / /proc/fs/nfsd rw,nosuid,nodev,noexec,relatime - nfsd nfsd rw + 44 15 0:35 / /home/tianon/.gvfs rw,nosuid,nodev,relatime - fuse.gvfs-fuse-daemon gvfs-fuse-daemon rw,user_id=1000,group_id=1000 + 68 15 0:3336 / /var/lib/docker/aufs/mnt/3597a1a6d6298c1decc339ebb90aad6f7d6ba2e15af3131b1f85e7ee4787a0cd rw,relatime - aufs none rw,si=9b4a7640128db39c +-85 68 8:6 /var/lib/docker/init/dockerinit-0.7.2-dev//deleted /var/lib/docker/aufs/mnt/3597a1a6d6298c1decc339ebb90aad6f7d6ba2e15af3131b1f85e7ee4787a0cd/.dockerinit rw,noatime,nodiratime - ext4 /dev/sda6 rw,data=ordered + 86 68 8:6 /var/lib/docker/containers/3597a1a6d6298c1decc339ebb90aad6f7d6ba2e15af3131b1f85e7ee4787a0cd/config.env /var/lib/docker/aufs/mnt/3597a1a6d6298c1decc339ebb90aad6f7d6ba2e15af3131b1f85e7ee4787a0cd/.dockerenv rw,noatime,nodiratime - ext4 /dev/sda6 rw,data=ordered + 87 68 8:6 /etc/resolv.conf /var/lib/docker/aufs/mnt/3597a1a6d6298c1decc339ebb90aad6f7d6ba2e15af3131b1f85e7ee4787a0cd/etc/resolv.conf rw,noatime,nodiratime - ext4 /dev/sda6 rw,data=ordered + 88 68 8:6 /var/lib/docker/containers/3597a1a6d6298c1decc339ebb90aad6f7d6ba2e15af3131b1f85e7ee4787a0cd/hostname /var/lib/docker/aufs/mnt/3597a1a6d6298c1decc339ebb90aad6f7d6ba2e15af3131b1f85e7ee4787a0cd/etc/hostname rw,noatime,nodiratime - ext4 /dev/sda6 rw,data=ordered +diff --git a/utils/utils.go b/utils/utils.go +index 340b9e4..49f50dd 100644 +--- a/utils/utils.go ++++ b/utils/utils.go +@@ -1,124 +1,17 @@ + package utils + + import ( +- "crypto/sha1" +- "encoding/hex" + "fmt" +- "io" + "io/ioutil" + "os" +- "os/exec" +- "path/filepath" + "runtime" + "strings" + + "github.com/docker/distribution/registry/api/errcode" +- "github.com/docker/docker/dockerversion" + "github.com/docker/docker/pkg/archive" + "github.com/docker/docker/pkg/stringid" + ) + +-// SelfPath figures out the absolute path of our own binary (if it's still around). +-func SelfPath() string { +- path, err := exec.LookPath(os.Args[0]) +- if err != nil { +- if os.IsNotExist(err) { +- return "" +- } +- if execErr, ok := err.(*exec.Error); ok && os.IsNotExist(execErr.Err) { +- return "" +- } +- panic(err) +- } +- path, err = filepath.Abs(path) +- if err != nil { +- if os.IsNotExist(err) { +- return "" +- } +- panic(err) +- } +- return path +-} +- +-func dockerInitSha1(target string) string { +- f, err := os.Open(target) +- if err != nil { +- return "" +- } +- defer f.Close() +- h := sha1.New() +- _, err = io.Copy(h, f) +- if err != nil { +- return "" +- } +- return hex.EncodeToString(h.Sum(nil)) +-} +- +-func isValidDockerInitPath(target string, selfPath string) bool { // target and selfPath should be absolute (InitPath and SelfPath already do this) +- if target == "" { +- return false +- } +- if dockerversion.IAmStatic == "true" { +- if selfPath == "" { +- return false +- } +- if target == selfPath { +- return true +- } +- targetFileInfo, err := os.Lstat(target) +- if err != nil { +- return false +- } +- selfPathFileInfo, err := os.Lstat(selfPath) +- if err != nil { +- return false +- } +- return os.SameFile(targetFileInfo, selfPathFileInfo) +- } +- return dockerversion.InitSHA1 != "" && dockerInitSha1(target) == dockerversion.InitSHA1 +-} +- +-// DockerInitPath figures out the path of our dockerinit (which may be SelfPath()) +-func DockerInitPath(localCopy string) string { +- selfPath := SelfPath() +- if isValidDockerInitPath(selfPath, selfPath) { +- // if we're valid, don't bother checking anything else +- return selfPath +- } +- var possibleInits = []string{ +- localCopy, +- dockerversion.InitPath, +- filepath.Join(filepath.Dir(selfPath), "dockerinit"), +- +- // FHS 3.0 Draft: "/usr/libexec includes internal binaries that are not intended to be executed directly by users or shell scripts. Applications may use a single subdirectory under /usr/libexec." +- // https://www.linuxbase.org/betaspecs/fhs/fhs.html#usrlibexec +- "/usr/libexec/docker/dockerinit", +- "/usr/local/libexec/docker/dockerinit", +- +- // FHS 2.3: "/usr/lib includes object files, libraries, and internal binaries that are not intended to be executed directly by users or shell scripts." +- // https://refspecs.linuxfoundation.org/FHS_2.3/fhs-2.3.html#USRLIBLIBRARIESFORPROGRAMMINGANDPA +- "/usr/lib/docker/dockerinit", +- "/usr/local/lib/docker/dockerinit", +- } +- for _, dockerInit := range possibleInits { +- if dockerInit == "" { +- continue +- } +- path, err := exec.LookPath(dockerInit) +- if err == nil { +- path, err = filepath.Abs(path) +- if err != nil { +- // LookPath already validated that this file exists and is executable (following symlinks), so how could Abs fail? +- panic(err) +- } +- if isValidDockerInitPath(path, selfPath) { +- return path +- } +- } +- } +- return "" +-} +- + var globalTestID string + + // TestDirectory creates a new temporary directory and returns its path. + +From e72192be404c9a8489191d43fd6e5c429081d5c8 Mon Sep 17 00:00:00 2001 +From: Aleksa Sarai +Date: Thu, 21 Jan 2016 01:27:46 +1100 +Subject: [PATCH 2/3] *: remove documentation references to dockerinit + +While the documentation is very patchy on dockerinit, remove all +references in packaging documentation to the now purged dockerinit. + +Signed-off-by: Aleksa Sarai +--- + project/PACKAGERS.md | 33 +-------------------------------- + 1 file changed, 1 insertion(+), 32 deletions(-) + +diff --git a/project/PACKAGERS.md b/project/PACKAGERS.md +index 780e961..3ca75e7 100644 +--- a/project/PACKAGERS.md ++++ b/project/PACKAGERS.md +@@ -210,7 +210,7 @@ the file "./VERSION". This binary is usually installed somewhere like + + ### Dynamic Daemon / Client-only Binary + +-If you are only interested in a Docker client binary, set `DOCKER_CLIENTONLY` to a non-empty value using something similar to the following: (which will prevent the extra step of compiling dockerinit) ++If you are only interested in a Docker client binary, set `DOCKER_CLIENTONLY` to a non-empty value using something similar to the following: + + ```bash + export DOCKER_CLIENTONLY=1 +@@ -228,37 +228,6 @@ following: + This will create "./bundles/$VERSION/dynbinary/docker-$VERSION", which for + client-only builds is the important file to grab and install as appropriate. + +-For daemon builds, you will also need to grab and install +-"./bundles/$VERSION/dynbinary/dockerinit-$VERSION", which is created from the +-minimal set of Docker's codebase that _must_ be compiled statically (and is thus +-a pure static binary). The acceptable locations Docker will search for this file +-are as follows (in order): +- +-* as "dockerinit" in the same directory as the daemon binary (ie, if docker is +- installed at "/usr/bin/docker", then "/usr/bin/dockerinit" will be the first +- place this file is searched for) +-* "/usr/libexec/docker/dockerinit" or "/usr/local/libexec/docker/dockerinit" +- ([FHS 3.0 Draft](https://www.linuxbase.org/betaspecs/fhs/fhs.html#usrlibexec)) +-* "/usr/lib/docker/dockerinit" or "/usr/local/lib/docker/dockerinit" ([FHS +- 2.3](https://refspecs.linuxfoundation.org/FHS_2.3/fhs-2.3.html#USRLIBLIBRARIESFORPROGRAMMINGANDPA)) +- +-If (and please, only if) one of the paths above is insufficient due to distro +-policy or similar issues, you may use the `DOCKER_INITPATH` environment variable +-at compile-time as follows to set a different path for Docker to search: +- +-```bash +-export DOCKER_INITPATH=/usr/lib/docker.io/dockerinit +-``` +- +-If you find yourself needing this, please don't hesitate to reach out to Tianon +-to see if it would be reasonable or helpful to add more paths to Docker's list, +-especially if there's a relevant standard worth referencing (such as the FHS). +- +-Also, it goes without saying, but for the purposes of the daemon please consider +-these two binaries ("docker" and "dockerinit") as if they were a single unit. +-Mixing and matching can cause undesired consequences, and will fail to run +-properly. +- + ## System Dependencies + + ### Runtime Dependencies + +From 71c63aa72e3788af27fef0de9005cde6c7728a2b Mon Sep 17 00:00:00 2001 +From: Aleksa Sarai +Date: Tue, 26 Jan 2016 23:46:22 +1100 +Subject: [PATCH 3/3] vendor: update engine-api + +This removes all references to InitPath and InitSha1, as well as pulling +in a few other minor engine-api fixes. + +Signed-off-by: Aleksa Sarai +--- + hack/vendor.sh | 2 +- + .../github.com/docker/engine-api/client/client.go | 22 +++++++++++++++------- + .../docker/engine-api/client/client_nounix.go | 6 ++++++ + .../docker/engine-api/client/client_unix.go | 6 ++++++ + .../docker/engine-api/client/container_commit.go | 9 +++------ + .../docker/engine-api/client/container_create.go | 17 +++-------------- + .../docker/engine-api/client/container_inspect.go | 2 +- + .../docker/engine-api/client/container_list.go | 2 +- + .../docker/engine-api/client/container_top.go | 2 +- + .../github.com/docker/engine-api/client/diff.go | 9 +++------ + .../github.com/docker/engine-api/client/exec.go | 4 ++-- + .../github.com/docker/engine-api/client/history.go | 8 +++----- + .../docker/engine-api/client/image_list.go | 2 +- + .../docker/engine-api/client/image_remove.go | 2 +- + .../docker/engine-api/client/image_search.go | 2 +- + .../github.com/docker/engine-api/client/login.go | 2 +- + .../github.com/docker/engine-api/client/network.go | 4 ++-- + .../github.com/docker/engine-api/client/version.go | 2 +- + .../github.com/docker/engine-api/client/volume.go | 6 +++--- + .../engine-api/types/container/host_config.go | 8 +++++++- + .../github.com/docker/engine-api/types/types.go | 5 +++-- + 21 files changed, 65 insertions(+), 57 deletions(-) + create mode 100644 vendor/src/github.com/docker/engine-api/client/client_nounix.go + create mode 100644 vendor/src/github.com/docker/engine-api/client/client_unix.go + +diff --git a/hack/vendor.sh b/hack/vendor.sh +index 535e4eb..a13d6c6 100755 +--- a/hack/vendor.sh ++++ b/hack/vendor.sh +@@ -22,7 +22,7 @@ clone git github.com/vdemeester/shakers 3c10293ce22b900c27acad7b28656196fcc2f73b + clone git golang.org/x/net 47990a1ba55743e6ef1affd3a14e5bac8553615d https://github.com/golang/net.git + clone git github.com/docker/go-units 651fc226e7441360384da338d0fd37f2440ffbe3 + clone git github.com/docker/go-connections v0.1.2 +-clone git github.com/docker/engine-api v0.2.2 ++clone git github.com/docker/engine-api bdbab71ec21209ef56dffdbe42c9d21843c30862 + clone git github.com/RackSec/srslog 6eb773f331e46fbba8eecb8e794e635e75fc04de + clone git github.com/imdario/mergo 0.2.1 + +diff --git a/vendor/src/github.com/docker/engine-api/client/client.go b/vendor/src/github.com/docker/engine-api/client/client.go +index 28f00e5..a62d859 100644 +--- a/vendor/src/github.com/docker/engine-api/client/client.go ++++ b/vendor/src/github.com/docker/engine-api/client/client.go +@@ -10,6 +10,8 @@ import ( + "path/filepath" + "strings" + "time" ++ ++ "github.com/docker/go-connections/tlsconfig" + ) + + // Client is the API client that performs all operations +@@ -41,21 +43,27 @@ type Client struct { + func NewEnvClient() (*Client, error) { + var transport *http.Transport + if dockerCertPath := os.Getenv("DOCKER_CERT_PATH"); dockerCertPath != "" { +- tlsc := &tls.Config{} +- +- cert, err := tls.LoadX509KeyPair(filepath.Join(dockerCertPath, "cert.pem"), filepath.Join(dockerCertPath, "key.pem")) ++ options := tlsconfig.Options{ ++ CAFile: filepath.Join(dockerCertPath, "ca.pem"), ++ CertFile: filepath.Join(dockerCertPath, "cert.pem"), ++ KeyFile: filepath.Join(dockerCertPath, "key.pem"), ++ InsecureSkipVerify: os.Getenv("DOCKER_TLS_VERIFY") == "", ++ } ++ tlsc, err := tlsconfig.Client(options) + if err != nil { +- return nil, fmt.Errorf("Error loading x509 key pair: %s", err) ++ return nil, err + } + +- tlsc.Certificates = append(tlsc.Certificates, cert) +- tlsc.InsecureSkipVerify = os.Getenv("DOCKER_TLS_VERIFY") == "" + transport = &http.Transport{ + TLSClientConfig: tlsc, + } + } + +- return NewClient(os.Getenv("DOCKER_HOST"), os.Getenv("DOCKER_API_VERSION"), transport, nil) ++ host := os.Getenv("DOCKER_HOST") ++ if host == "" { ++ host = DefaultDockerHost ++ } ++ return NewClient(host, os.Getenv("DOCKER_API_VERSION"), transport, nil) + } + + // NewClient initializes a new API client for the given host and API version. +diff --git a/vendor/src/github.com/docker/engine-api/client/client_nounix.go b/vendor/src/github.com/docker/engine-api/client/client_nounix.go +new file mode 100644 +index 0000000..d07ab84 +--- /dev/null ++++ b/vendor/src/github.com/docker/engine-api/client/client_nounix.go +@@ -0,0 +1,6 @@ ++// +build windows darwin ++ ++package client ++ ++// DefaultDockerHost defines os specific default if DOCKER_HOST is unset ++const DefaultDockerHost = "tcp://127.0.0.1:2375" +diff --git a/vendor/src/github.com/docker/engine-api/client/client_unix.go b/vendor/src/github.com/docker/engine-api/client/client_unix.go +new file mode 100644 +index 0000000..39c4bd8 +--- /dev/null ++++ b/vendor/src/github.com/docker/engine-api/client/client_unix.go +@@ -0,0 +1,6 @@ ++// +build linux freebsd ++ ++package client ++ ++// DefaultDockerHost defines os specific default if DOCKER_HOST is unset ++const DefaultDockerHost = "unix:///var/run/docker.sock" +diff --git a/vendor/src/github.com/docker/engine-api/client/container_commit.go b/vendor/src/github.com/docker/engine-api/client/container_commit.go +index 488d087..47534a6 100644 +--- a/vendor/src/github.com/docker/engine-api/client/container_commit.go ++++ b/vendor/src/github.com/docker/engine-api/client/container_commit.go +@@ -27,11 +27,8 @@ func (cli *Client) ContainerCommit(options types.ContainerCommitOptions) (types. + if err != nil { + return response, err + } +- defer ensureReaderClosed(resp) + +- if err := json.NewDecoder(resp.body).Decode(&response); err != nil { +- return response, err +- } +- +- return response, nil ++ err = json.NewDecoder(resp.body).Decode(&response) ++ ensureReaderClosed(resp) ++ return response, err + } +diff --git a/vendor/src/github.com/docker/engine-api/client/container_create.go b/vendor/src/github.com/docker/engine-api/client/container_create.go +index 0f85e7b..61b560a 100644 +--- a/vendor/src/github.com/docker/engine-api/client/container_create.go ++++ b/vendor/src/github.com/docker/engine-api/client/container_create.go +@@ -39,18 +39,7 @@ func (cli *Client) ContainerCreate(config *container.Config, hostConfig *contain + return response, err + } + +- if serverResp.statusCode == 404 && strings.Contains(err.Error(), "No such image") { +- return response, imageNotFoundError{config.Image} +- } +- +- if err != nil { +- return response, err +- } +- defer ensureReaderClosed(serverResp) +- +- if err := json.NewDecoder(serverResp.body).Decode(&response); err != nil { +- return response, err +- } +- +- return response, nil ++ err = json.NewDecoder(serverResp.body).Decode(&response) ++ ensureReaderClosed(serverResp) ++ return response, err + } +diff --git a/vendor/src/github.com/docker/engine-api/client/container_inspect.go b/vendor/src/github.com/docker/engine-api/client/container_inspect.go +index c18a764..f99e46f 100644 +--- a/vendor/src/github.com/docker/engine-api/client/container_inspect.go ++++ b/vendor/src/github.com/docker/engine-api/client/container_inspect.go +@@ -19,10 +19,10 @@ func (cli *Client) ContainerInspect(containerID string) (types.ContainerJSON, er + } + return types.ContainerJSON{}, err + } +- defer ensureReaderClosed(serverResp) + + var response types.ContainerJSON + err = json.NewDecoder(serverResp.body).Decode(&response) ++ ensureReaderClosed(serverResp) + return response, err + } + +diff --git a/vendor/src/github.com/docker/engine-api/client/container_list.go b/vendor/src/github.com/docker/engine-api/client/container_list.go +index b55307c..f553287 100644 +--- a/vendor/src/github.com/docker/engine-api/client/container_list.go ++++ b/vendor/src/github.com/docker/engine-api/client/container_list.go +@@ -46,9 +46,9 @@ func (cli *Client) ContainerList(options types.ContainerListOptions) ([]types.Co + if err != nil { + return nil, err + } +- defer ensureReaderClosed(resp) + + var containers []types.Container + err = json.NewDecoder(resp.body).Decode(&containers) ++ ensureReaderClosed(resp) + return containers, err + } +diff --git a/vendor/src/github.com/docker/engine-api/client/container_top.go b/vendor/src/github.com/docker/engine-api/client/container_top.go +index 04aecc2..1673947 100644 +--- a/vendor/src/github.com/docker/engine-api/client/container_top.go ++++ b/vendor/src/github.com/docker/engine-api/client/container_top.go +@@ -20,8 +20,8 @@ func (cli *Client) ContainerTop(containerID string, arguments []string) (types.C + if err != nil { + return response, err + } +- defer ensureReaderClosed(resp) + + err = json.NewDecoder(resp.body).Decode(&response) ++ ensureReaderClosed(resp) + return response, err + } +diff --git a/vendor/src/github.com/docker/engine-api/client/diff.go b/vendor/src/github.com/docker/engine-api/client/diff.go +index 6639d8b..c57bf69 100644 +--- a/vendor/src/github.com/docker/engine-api/client/diff.go ++++ b/vendor/src/github.com/docker/engine-api/client/diff.go +@@ -15,11 +15,8 @@ func (cli *Client) ContainerDiff(containerID string) ([]types.ContainerChange, e + if err != nil { + return changes, err + } +- defer ensureReaderClosed(serverResp) + +- if err := json.NewDecoder(serverResp.body).Decode(&changes); err != nil { +- return changes, err +- } +- +- return changes, nil ++ err = json.NewDecoder(serverResp.body).Decode(&changes) ++ ensureReaderClosed(serverResp) ++ return changes, err + } +diff --git a/vendor/src/github.com/docker/engine-api/client/exec.go b/vendor/src/github.com/docker/engine-api/client/exec.go +index 3a86b40..3d4577e 100644 +--- a/vendor/src/github.com/docker/engine-api/client/exec.go ++++ b/vendor/src/github.com/docker/engine-api/client/exec.go +@@ -13,8 +13,8 @@ func (cli *Client) ContainerExecCreate(config types.ExecConfig) (types.Container + if err != nil { + return response, err + } +- defer ensureReaderClosed(resp) + err = json.NewDecoder(resp.body).Decode(&response) ++ ensureReaderClosed(resp) + return response, err + } + +@@ -41,8 +41,8 @@ func (cli *Client) ContainerExecInspect(execID string) (types.ContainerExecInspe + if err != nil { + return response, err + } +- defer ensureReaderClosed(resp) + + err = json.NewDecoder(resp.body).Decode(&response) ++ ensureReaderClosed(resp) + return response, err + } +diff --git a/vendor/src/github.com/docker/engine-api/client/history.go b/vendor/src/github.com/docker/engine-api/client/history.go +index 7769727..21a2622 100644 +--- a/vendor/src/github.com/docker/engine-api/client/history.go ++++ b/vendor/src/github.com/docker/engine-api/client/history.go +@@ -14,10 +14,8 @@ func (cli *Client) ImageHistory(imageID string) ([]types.ImageHistory, error) { + if err != nil { + return history, err + } +- defer ensureReaderClosed(serverResp) + +- if err := json.NewDecoder(serverResp.body).Decode(&history); err != nil { +- return history, err +- } +- return history, nil ++ err = json.NewDecoder(serverResp.body).Decode(&history) ++ ensureReaderClosed(serverResp) ++ return history, err + } +diff --git a/vendor/src/github.com/docker/engine-api/client/image_list.go b/vendor/src/github.com/docker/engine-api/client/image_list.go +index d961570..0cdb0ba 100644 +--- a/vendor/src/github.com/docker/engine-api/client/image_list.go ++++ b/vendor/src/github.com/docker/engine-api/client/image_list.go +@@ -32,8 +32,8 @@ func (cli *Client) ImageList(options types.ImageListOptions) ([]types.Image, err + if err != nil { + return images, err + } +- defer ensureReaderClosed(serverResp) + + err = json.NewDecoder(serverResp.body).Decode(&images) ++ ensureReaderClosed(serverResp) + return images, err + } +diff --git a/vendor/src/github.com/docker/engine-api/client/image_remove.go b/vendor/src/github.com/docker/engine-api/client/image_remove.go +index c9c232c..28edb8e 100644 +--- a/vendor/src/github.com/docker/engine-api/client/image_remove.go ++++ b/vendor/src/github.com/docker/engine-api/client/image_remove.go +@@ -22,9 +22,9 @@ func (cli *Client) ImageRemove(options types.ImageRemoveOptions) ([]types.ImageD + if err != nil { + return nil, err + } +- defer ensureReaderClosed(resp) + + var dels []types.ImageDelete + err = json.NewDecoder(resp.body).Decode(&dels) ++ ensureReaderClosed(resp) + return dels, err + } +diff --git a/vendor/src/github.com/docker/engine-api/client/image_search.go b/vendor/src/github.com/docker/engine-api/client/image_search.go +index 5d9413c..0cad8a7 100644 +--- a/vendor/src/github.com/docker/engine-api/client/image_search.go ++++ b/vendor/src/github.com/docker/engine-api/client/image_search.go +@@ -27,9 +27,9 @@ func (cli *Client) ImageSearch(options types.ImageSearchOptions, privilegeFunc R + if err != nil { + return results, err + } +- defer ensureReaderClosed(resp) + + err = json.NewDecoder(resp.body).Decode(&results) ++ ensureReaderClosed(resp) + return results, err + } + +diff --git a/vendor/src/github.com/docker/engine-api/client/login.go b/vendor/src/github.com/docker/engine-api/client/login.go +index e9ba842..5ddcd5b 100644 +--- a/vendor/src/github.com/docker/engine-api/client/login.go ++++ b/vendor/src/github.com/docker/engine-api/client/login.go +@@ -19,9 +19,9 @@ func (cli *Client) RegistryLogin(auth types.AuthConfig) (types.AuthResponse, err + if err != nil { + return types.AuthResponse{}, err + } +- defer ensureReaderClosed(resp) + + var response types.AuthResponse + err = json.NewDecoder(resp.body).Decode(&response) ++ ensureReaderClosed(resp) + return response, err + } +diff --git a/vendor/src/github.com/docker/engine-api/client/network.go b/vendor/src/github.com/docker/engine-api/client/network.go +index de7f184..90b9adb 100644 +--- a/vendor/src/github.com/docker/engine-api/client/network.go ++++ b/vendor/src/github.com/docker/engine-api/client/network.go +@@ -65,8 +65,8 @@ func (cli *Client) NetworkList(options types.NetworkListOptions) ([]types.Networ + if err != nil { + return networkResources, err + } +- defer ensureReaderClosed(resp) + err = json.NewDecoder(resp.body).Decode(&networkResources) ++ ensureReaderClosed(resp) + return networkResources, err + } + +@@ -80,7 +80,7 @@ func (cli *Client) NetworkInspect(networkID string) (types.NetworkResource, erro + } + return networkResource, err + } +- defer ensureReaderClosed(resp) + err = json.NewDecoder(resp.body).Decode(&networkResource) ++ ensureReaderClosed(resp) + return networkResource, err + } +diff --git a/vendor/src/github.com/docker/engine-api/client/version.go b/vendor/src/github.com/docker/engine-api/client/version.go +index e97b798..0e9ce61 100644 +--- a/vendor/src/github.com/docker/engine-api/client/version.go ++++ b/vendor/src/github.com/docker/engine-api/client/version.go +@@ -12,9 +12,9 @@ func (cli *Client) ServerVersion() (types.Version, error) { + if err != nil { + return types.Version{}, err + } +- defer ensureReaderClosed(resp) + + var server types.Version + err = json.NewDecoder(resp.body).Decode(&server) ++ ensureReaderClosed(resp) + return server, err + } +diff --git a/vendor/src/github.com/docker/engine-api/client/volume.go b/vendor/src/github.com/docker/engine-api/client/volume.go +index 3419def..597e318 100644 +--- a/vendor/src/github.com/docker/engine-api/client/volume.go ++++ b/vendor/src/github.com/docker/engine-api/client/volume.go +@@ -25,9 +25,9 @@ func (cli *Client) VolumeList(filter filters.Args) (types.VolumesListResponse, e + if err != nil { + return volumes, err + } +- defer ensureReaderClosed(resp) + + err = json.NewDecoder(resp.body).Decode(&volumes) ++ ensureReaderClosed(resp) + return volumes, err + } + +@@ -41,8 +41,8 @@ func (cli *Client) VolumeInspect(volumeID string) (types.Volume, error) { + } + return volume, err + } +- defer ensureReaderClosed(resp) + err = json.NewDecoder(resp.body).Decode(&volume) ++ ensureReaderClosed(resp) + return volume, err + } + +@@ -53,8 +53,8 @@ func (cli *Client) VolumeCreate(options types.VolumeCreateRequest) (types.Volume + if err != nil { + return volume, err + } +- defer ensureReaderClosed(resp) + err = json.NewDecoder(resp.body).Decode(&volume) ++ ensureReaderClosed(resp) + return volume, err + } + +diff --git a/vendor/src/github.com/docker/engine-api/types/container/host_config.go b/vendor/src/github.com/docker/engine-api/types/container/host_config.go +index f43263d..b7c459e 100644 +--- a/vendor/src/github.com/docker/engine-api/types/container/host_config.go ++++ b/vendor/src/github.com/docker/engine-api/types/container/host_config.go +@@ -151,6 +151,11 @@ func (rp *RestartPolicy) IsUnlessStopped() bool { + return rp.Name == "unless-stopped" + } + ++// IsSame compares two RestartPolicy to see if they are the same ++func (rp *RestartPolicy) IsSame(tp *RestartPolicy) bool { ++ return rp.Name == tp.Name && rp.MaximumRetryCount == tp.MaximumRetryCount ++} ++ + // LogConfig represents the logging configuration of the container. + type LogConfig struct { + Type string +@@ -178,7 +183,7 @@ type Resources struct { + KernelMemory int64 // Kernel memory limit (in bytes) + Memory int64 // Memory limit (in bytes) + MemoryReservation int64 // Memory soft limit (in bytes) +- MemorySwap int64 // Total memory usage (memory + swap); set `-1` to disable swap ++ MemorySwap int64 // Total memory usage (memory + swap); set `-1` to enable unlimited swap + MemorySwappiness *int64 // Tuning container memory swappiness behaviour + OomKillDisable *bool // Whether to disable OOM Killer or not + PidsLimit int64 // Setting pids limit for a container +@@ -190,6 +195,7 @@ type Resources struct { + type UpdateConfig struct { + // Contains container's resources (cgroups, ulimits) + Resources ++ RestartPolicy RestartPolicy + } + + // HostConfig the non-portable Config structure of a container. +diff --git a/vendor/src/github.com/docker/engine-api/types/types.go b/vendor/src/github.com/docker/engine-api/types/types.go +index 9666ea4..de8b0be 100644 +--- a/vendor/src/github.com/docker/engine-api/types/types.go ++++ b/vendor/src/github.com/docker/engine-api/types/types.go +@@ -142,6 +142,7 @@ type Container struct { + SizeRw int64 `json:",omitempty"` + SizeRootFs int64 `json:",omitempty"` + Labels map[string]string ++ State string + Status string + HostConfig struct { + NetworkMode string `json:",omitempty"` +@@ -198,6 +199,7 @@ type Info struct { + Images int + Driver string + DriverStatus [][2]string ++ SystemStatus [][2]string + Plugins PluginsInfo + MemoryLimit bool + SwapLimit bool +@@ -222,8 +224,6 @@ type Info struct { + Architecture string + IndexServerAddress string + RegistryConfig *registry.ServiceConfig +- InitSha1 string +- InitPath string + NCPU int + MemTotal int64 + DockerRootDir string +@@ -388,6 +388,7 @@ type NetworkResource struct { + Scope string + Driver string + IPAM network.IPAM ++ Internal bool + Containers map[string]EndpointResource + Options map[string]string + } +