diff --git a/container/container.go b/container/container.go index ae98e0dc5a..ea083c52bc 100644 --- a/container/container.go +++ b/container/container.go @@ -22,7 +22,6 @@ import ( "github.com/docker/docker/pkg/promise" "github.com/docker/docker/pkg/signal" "github.com/docker/docker/pkg/symlink" - "github.com/docker/docker/pkg/system" "github.com/docker/docker/runconfig" "github.com/docker/docker/volume" containertypes "github.com/docker/engine-api/types/container" @@ -184,34 +183,6 @@ func (container *Container) WriteHostConfig() error { return json.NewEncoder(f).Encode(&container.HostConfig) } -// SetupWorkingDirectory sets up the container's working directory as set in container.Config.WorkingDir -func (container *Container) SetupWorkingDirectory() error { - if container.Config.WorkingDir == "" { - return nil - } - container.Config.WorkingDir = filepath.Clean(container.Config.WorkingDir) - - pth, err := container.GetResourcePath(container.Config.WorkingDir) - if err != nil { - return err - } - - pthInfo, err := os.Stat(pth) - if err != nil { - if !os.IsNotExist(err) { - return err - } - - if err := system.MkdirAll(pth, 0755); err != nil { - return err - } - } - if pthInfo != nil && !pthInfo.IsDir() { - return derr.ErrorCodeNotADir.WithArgs(container.Config.WorkingDir) - } - return nil -} - // GetResourcePath evaluates `path` in the scope of the container's BaseFS, with proper path // sanitisation. Symlinks are all scoped to the BaseFS of the container, as // though the container's BaseFS was `/`. diff --git a/container/container_unix.go b/container/container_unix.go index 59bb71821f..22c7544179 100644 --- a/container/container_unix.go +++ b/container/container_unix.go @@ -398,6 +398,34 @@ func (container *Container) BuildCreateEndpointOptions(n libnetwork.Network, epC return createOptions, nil } +// SetupWorkingDirectory sets up the container's working directory as set in container.Config.WorkingDir +func (container *Container) SetupWorkingDirectory() error { + if container.Config.WorkingDir == "" { + return nil + } + container.Config.WorkingDir = filepath.Clean(container.Config.WorkingDir) + + pth, err := container.GetResourcePath(container.Config.WorkingDir) + if err != nil { + return err + } + + pthInfo, err := os.Stat(pth) + if err != nil { + if !os.IsNotExist(err) { + return err + } + + if err := system.MkdirAll(pth, 0755); err != nil { + return err + } + } + if pthInfo != nil && !pthInfo.IsDir() { + return derr.ErrorCodeNotADir.WithArgs(container.Config.WorkingDir) + } + return nil +} + // appendNetworkMounts appends any network mounts to the array of mount points passed in func appendNetworkMounts(container *Container, volumeMounts []volume.MountPoint) ([]volume.MountPoint, error) { for _, mnt := range container.NetworkMounts() { diff --git a/container/container_windows.go b/container/container_windows.go index 4bdadaf008..af68086f8d 100644 --- a/container/container_windows.go +++ b/container/container_windows.go @@ -22,6 +22,12 @@ func (container *Container) CreateDaemonEnvironment(linkedEnv []string) []string return container.Config.Env } +// SetupWorkingDirectory initializes the container working directory. +// This is a NOOP In windows. +func (container *Container) SetupWorkingDirectory() error { + return nil +} + // UnmountIpcMounts unmount Ipc related mounts. // This is a NOOP on windows. func (container *Container) UnmountIpcMounts(unmount func(pth string) error) { diff --git a/integration-cli/docker_cli_run_test.go b/integration-cli/docker_cli_run_test.go index d1c1a98a7f..265910f79c 100644 --- a/integration-cli/docker_cli_run_test.go +++ b/integration-cli/docker_cli_run_test.go @@ -1724,7 +1724,7 @@ func (s *DockerSuite) TestRunWorkdirExistsAndIsFile(c *check.C) { expected := "Cannot mkdir: /bin/cat is not a directory" if daemonPlatform == "windows" { existingFile = `\windows\system32\ntdll.dll` - expected = `Cannot mkdir: \windows\system32\ntdll.dll is not a directory.` + expected = "The directory name is invalid" } out, exitCode, err := dockerCmdWithError("run", "-w", existingFile, "busybox")