From b06eb99229b231270f966802009284910f749acc Mon Sep 17 00:00:00 2001 From: John Howard Date: Wed, 4 May 2016 11:06:54 -0700 Subject: [PATCH] Windows: Support ARG in builder Signed-off-by: John Howard Upstream-commit: 6b5c83bf18fe406e397c001acb0a1d9d7e147fd9 Component: engine --- .../builder/dockerfile/evaluator_windows.go | 2 +- .../engine/container/container_windows.go | 7 ++++-- .../integration-cli/docker_cli_build_test.go | 25 +++++++++++++------ 3 files changed, 23 insertions(+), 11 deletions(-) diff --git a/components/engine/builder/dockerfile/evaluator_windows.go b/components/engine/builder/dockerfile/evaluator_windows.go index c14498a0b5..43a0b70be7 100644 --- a/components/engine/builder/dockerfile/evaluator_windows.go +++ b/components/engine/builder/dockerfile/evaluator_windows.go @@ -6,7 +6,7 @@ import "fmt" // a command not supported on the platform. func platformSupports(command string) error { switch command { - case "user", "stopsignal", "arg": + case "user", "stopsignal": return fmt.Errorf("The daemon on this platform does not support the command '%s'", command) } return nil diff --git a/components/engine/container/container_windows.go b/components/engine/container/container_windows.go index 5c923960bb..c860df56ef 100644 --- a/components/engine/container/container_windows.go +++ b/components/engine/container/container_windows.go @@ -7,6 +7,7 @@ import ( "os" "path/filepath" + "github.com/docker/docker/utils" "github.com/docker/docker/volume" containertypes "github.com/docker/engine-api/types/container" ) @@ -30,8 +31,10 @@ type ExitStatus struct { // CreateDaemonEnvironment creates a new environment variable slice for this container. func (container *Container) CreateDaemonEnvironment(linkedEnv []string) []string { - // On Windows, nothing to link. Just return the container environment. - return container.Config.Env + // because the env on the container can override certain default values + // we need to replace the 'env' keys where they match and append anything + // else. + return utils.ReplaceOrAppendEnvValues(linkedEnv, container.Config.Env) } // UnmountIpcMounts unmount Ipc related mounts. diff --git a/components/engine/integration-cli/docker_cli_build_test.go b/components/engine/integration-cli/docker_cli_build_test.go index ab9163be1f..51ba75d3cf 100644 --- a/components/engine/integration-cli/docker_cli_build_test.go +++ b/components/engine/integration-cli/docker_cli_build_test.go @@ -6171,17 +6171,24 @@ func (s *DockerSuite) TestBuildStopSignal(c *check.C) { } func (s *DockerSuite) TestBuildBuildTimeArg(c *check.C) { - testRequires(c, DaemonIsLinux) // Windows does not support ARG imgName := "bldargtest" envKey := "foo" envVal := "bar" - args := []string{ - "--build-arg", fmt.Sprintf("%s=%s", envKey, envVal), + args := []string{"--build-arg", fmt.Sprintf("%s=%s", envKey, envVal)} + var dockerfile string + if daemonPlatform == "windows" { + // Bugs in Windows busybox port - use the default base image and native cmd stuff + dockerfile = fmt.Sprintf(`FROM `+minimalBaseImage()+` + ARG %s + RUN echo %%%s%% + CMD setlocal enableextensions && if defined %s (echo %%%s%%)`, envKey, envKey, envKey, envKey) + } else { + dockerfile = fmt.Sprintf(`FROM busybox + ARG %s + RUN echo $%s + CMD echo $%s`, envKey, envKey, envKey) + } - dockerfile := fmt.Sprintf(`FROM busybox - ARG %s - RUN echo $%s - CMD echo $%s`, envKey, envKey, envKey) if _, out, err := buildImageWithOut(imgName, dockerfile, true, args...); err != nil || !strings.Contains(out, envVal) { if err != nil { @@ -6191,7 +6198,9 @@ func (s *DockerSuite) TestBuildBuildTimeArg(c *check.C) { } containerName := "bldargCont" - if out, _ := dockerCmd(c, "run", "--name", containerName, imgName); out != "\n" { + out, _ := dockerCmd(c, "run", "--name", containerName, imgName) + out = strings.Trim(out, " \r\n'") + if out != "" { c.Fatalf("run produced invalid output: %q, expected empty string", out) } }