From f0b93b6ed8b4c0776065be972b4d5b4611f25fbf Mon Sep 17 00:00:00 2001 From: John Howard Date: Sat, 29 Oct 2016 18:43:04 -0700 Subject: [PATCH] Windows: Fix COPY file . after WORKDIR Signed-off-by: John Howard --- daemon/create_windows.go | 8 ++++++ integration-cli/docker_cli_build_test.go | 33 +++++++++++++++++++----- 2 files changed, 35 insertions(+), 6 deletions(-) diff --git a/daemon/create_windows.go b/daemon/create_windows.go index bbf0dbe7b9..11985c6730 100644 --- a/daemon/create_windows.go +++ b/daemon/create_windows.go @@ -16,6 +16,14 @@ func (daemon *Daemon) createContainerPlatformSpecificSettings(container *contain hostConfig.Isolation = daemon.defaultIsolation } + if err := daemon.Mount(container); err != nil { + return nil + } + defer daemon.Unmount(container) + if err := container.SetupWorkingDirectory(0, 0); err != nil { + return err + } + for spec := range config.Volumes { mp, err := volume.ParseMountRaw(spec, hostConfig.VolumeDriver) diff --git a/integration-cli/docker_cli_build_test.go b/integration-cli/docker_cli_build_test.go index 11bf806e2b..ccd9904a2e 100644 --- a/integration-cli/docker_cli_build_test.go +++ b/integration-cli/docker_cli_build_test.go @@ -1865,10 +1865,6 @@ func (s *DockerSuite) TestBuildWindowsWorkdirProcessing(c *check.C) { func (s *DockerSuite) TestBuildWindowsAddCopyPathProcessing(c *check.C) { testRequires(c, DaemonIsWindows) name := "testbuildwindowsaddcopypathprocessing" - // TODO Windows (@jhowardmsft). Needs a follow-up PR to 22181 to - // support backslash such as .\\ being equivalent to ./ and c:\\ being - // equivalent to c:/. This is not currently (nor ever has been) supported - // by docker on the Windows platform. dockerfile := ` FROM busybox # No trailing slash on COPY/ADD @@ -1878,8 +1874,8 @@ func (s *DockerSuite) TestBuildWindowsAddCopyPathProcessing(c *check.C) { WORKDIR /wc2 ADD wc2 c:/wc2 WORKDIR c:/ - RUN sh -c "[ $(cat c:/wc1) = 'hellowc1' ]" - RUN sh -c "[ $(cat c:/wc2) = 'worldwc2' ]" + RUN sh -c "[ $(cat c:/wc1/wc1) = 'hellowc1' ]" + RUN sh -c "[ $(cat c:/wc2/wc2) = 'worldwc2' ]" # Trailing slash on COPY/ADD, Windows-style path. WORKDIR /wd1 @@ -7174,3 +7170,28 @@ RUN echo vegeta c.Assert(out, checker.Contains, "Step 2/3 : RUN echo grafana && echo raintank") c.Assert(out, checker.Contains, "Step 3/3 : RUN echo vegeta") } + +// Verifies if COPY file . when WORKDIR is set to a non-existing directory, +// the directory is created and the file is copied into the directory, +// as opposed to the file being copied as a file with the name of the +// directory. Fix for 27545 (found on Windows, but regression good for Linux too) +func (s *DockerSuite) TestBuildCopyFileDotWithWorkdir(c *check.C) { + name := "testbuildcopyfiledotwithworkdir" + + ctx, err := fakeContext(`FROM busybox +WORKDIR /foo +COPY file . +RUN ["cat", "/foo/file"] +`, + map[string]string{}) + if err != nil { + c.Fatal(err) + } + defer ctx.Close() + if err := ctx.Add("file", "content"); err != nil { + c.Fatal(err) + } + if _, err = buildImageFromContext(name, ctx, true); err != nil { + c.Fatal(err) + } +}