From 56c66fb13ee4a17aa03ee97751457f0f871ff383 Mon Sep 17 00:00:00 2001 From: Daniel Nephin Date: Wed, 27 Apr 2016 12:11:32 -0400 Subject: [PATCH 1/2] When exec'ing dockerd, look for it in the same directory as the docker binary first, before checking path. Signed-off-by: Daniel Nephin Upstream-commit: 9db86a38cdc183cefade48103b9ddb44ce3032fe Component: engine --- components/engine/cmd/docker/daemon_unix.go | 21 +++++++++++++++++---- 1 file changed, 17 insertions(+), 4 deletions(-) diff --git a/components/engine/cmd/docker/daemon_unix.go b/components/engine/cmd/docker/daemon_unix.go index abe9ebfc51..896782b36c 100644 --- a/components/engine/cmd/docker/daemon_unix.go +++ b/components/engine/cmd/docker/daemon_unix.go @@ -5,27 +5,40 @@ package main import ( "os" "os/exec" + "path/filepath" "syscall" ) // CmdDaemon execs dockerd with the same flags -// TODO: add a deprecation warning? func (p DaemonProxy) CmdDaemon(args ...string) error { // Use os.Args[1:] so that "global" args are passed to dockerd args = stripDaemonArg(os.Args[1:]) - // TODO: check dirname args[0] first - binaryAbsPath, err := exec.LookPath(daemonBinary) + binaryPath, err := findDaemonBinary() if err != nil { return err } return syscall.Exec( - binaryAbsPath, + binaryPath, append([]string{daemonBinary}, args...), os.Environ()) } +// findDaemonBinary looks for the path to the dockerd binary starting with +// the directory of the current executable (if one exists) and followed by $PATH +func findDaemonBinary() (string, error) { + execDirname := filepath.Dir(os.Args[0]) + if execDirname != "" { + binaryPath := filepath.Join(execDirname, daemonBinary) + if _, err := os.Stat(binaryPath); err == nil { + return binaryPath, nil + } + } + + return exec.LookPath(daemonBinary) +} + // stripDaemonArg removes the `daemon` argument from the list func stripDaemonArg(args []string) []string { for i, arg := range args { From 86a8cdbb4b574f287ee8d3e22eec675ece475e2b Mon Sep 17 00:00:00 2001 From: Daniel Nephin Date: Wed, 27 Apr 2016 13:08:20 -0400 Subject: [PATCH 2/2] Raise a more relevant error when dockerd is not available on the platform. Signed-off-by: Daniel Nephin Upstream-commit: 8983d42988ad59f1a19a0f4e9e88dfec8b1be690 Component: engine --- .../cmd/docker/{daemon_windows.go => daemon_none.go} | 7 ++++++- .../docker/{daemon_windows_test.go => daemon_none_test.go} | 4 +++- components/engine/cmd/docker/daemon_unix.go | 2 +- components/engine/hack/make.sh | 1 + components/engine/hack/make/cross | 5 ++++- 5 files changed, 15 insertions(+), 4 deletions(-) rename components/engine/cmd/docker/{daemon_windows.go => daemon_none.go} (55%) rename components/engine/cmd/docker/{daemon_windows_test.go => daemon_none_test.go} (80%) diff --git a/components/engine/cmd/docker/daemon_windows.go b/components/engine/cmd/docker/daemon_none.go similarity index 55% rename from components/engine/cmd/docker/daemon_windows.go rename to components/engine/cmd/docker/daemon_none.go index 41c0133b67..d66bf1a546 100644 --- a/components/engine/cmd/docker/daemon_windows.go +++ b/components/engine/cmd/docker/daemon_none.go @@ -1,11 +1,16 @@ +// +build !daemon + package main import ( "fmt" + "runtime" + "strings" ) // CmdDaemon reports on an error on windows, because there is no exec func (p DaemonProxy) CmdDaemon(args ...string) error { return fmt.Errorf( - "`docker daemon` does not exist on windows. Please run `dockerd` directly") + "`docker daemon` is not supported on %s. Please run `dockerd` directly", + strings.Title(runtime.GOOS)) } diff --git a/components/engine/cmd/docker/daemon_windows_test.go b/components/engine/cmd/docker/daemon_none_test.go similarity index 80% rename from components/engine/cmd/docker/daemon_windows_test.go rename to components/engine/cmd/docker/daemon_none_test.go index 3da4e5d7cc..d75453bcc5 100644 --- a/components/engine/cmd/docker/daemon_windows_test.go +++ b/components/engine/cmd/docker/daemon_none_test.go @@ -1,3 +1,5 @@ +// +build !daemon + package main import ( @@ -9,7 +11,7 @@ func TestCmdDaemon(t *testing.T) { proxy := NewDaemonProxy() err := proxy.CmdDaemon("--help") if err == nil { - t.Fatal("Expected CmdDaemon to fail in Windows.") + t.Fatal("Expected CmdDaemon to fail on Windows.") } if !strings.Contains(err.Error(), "Please run `dockerd`") { diff --git a/components/engine/cmd/docker/daemon_unix.go b/components/engine/cmd/docker/daemon_unix.go index 896782b36c..7a27518636 100644 --- a/components/engine/cmd/docker/daemon_unix.go +++ b/components/engine/cmd/docker/daemon_unix.go @@ -1,4 +1,4 @@ -// +build !windows +// +build daemon package main diff --git a/components/engine/hack/make.sh b/components/engine/hack/make.sh index 36fe28bc18..e103a1aad8 100755 --- a/components/engine/hack/make.sh +++ b/components/engine/hack/make.sh @@ -127,6 +127,7 @@ if [ "$DOCKER_EXPERIMENTAL" ]; then DOCKER_BUILDTAGS+=" experimental" fi +DOCKER_BUILDTAGS+=" daemon" if pkg-config 'libsystemd >= 209' 2> /dev/null ; then DOCKER_BUILDTAGS+=" journald" elif pkg-config 'libsystemd-journal' 2> /dev/null ; then diff --git a/components/engine/hack/make/cross b/components/engine/hack/make/cross index 37214da36a..dfcd144018 100644 --- a/components/engine/hack/make/cross +++ b/components/engine/hack/make/cross @@ -35,7 +35,10 @@ for platform in $DOCKER_CROSSPLATFORMS; do fi if [ -z "${daemonSupporting[$platform]}" ]; then - export LDFLAGS_STATIC_DOCKER="" # we just need a simple client for these platforms + # we just need a simple client for these platforms + export LDFLAGS_STATIC_DOCKER="" + # remove the "daemon" build tag from platforms that aren't supported + export BUILDFLAGS=( "${ORIG_BUILDFLAGS[@]/ daemon/}" ) source "${MAKEDIR}/binary-client" else source "${MAKEDIR}/binary-client"