diff --git a/pkg/executor/push.go b/pkg/executor/push.go index ad8369dd6..ff81409e3 100644 --- a/pkg/executor/push.go +++ b/pkg/executor/push.go @@ -55,14 +55,16 @@ const ( UpstreamClientUaKey = "UPSTREAM_CLIENT_TYPE" ) -// DockerConfLocation returns the file system location of the Docker configuration -// from the DOCKER_CONFIG environment variable. If that variable is not set, it -// returns "/kaniko/.docker/config.json". +// DockerConfLocation returns the file system location of the Docker +// configuration file under the directory set in the DOCKER_CONFIG environment +// variable. If that variable is not set, it returns the OS-equivalent of +// "/kaniko/.docker/config.json". func DockerConfLocation() string { - if dockerConfLocation := os.Getenv("DOCKER_CONFIG"); dockerConfLocation != "" { - return dockerConfLocation + configFile := "config.json" + if dockerConfDir := os.Getenv("DOCKER_CONFIG"); dockerConfDir != "" { + return filepath.Join(dockerConfDir, configFile) } - return "/kaniko/.docker/config.json" + return string(os.PathSeparator) + filepath.Join("kaniko", ".docker", configFile) } func (w *withUserAgent) RoundTrip(r *http.Request) (*http.Response, error) { diff --git a/pkg/executor/push_test.go b/pkg/executor/push_test.go index 7bdb50d46..7d919db7b 100644 --- a/pkg/executor/push_test.go +++ b/pkg/executor/push_test.go @@ -46,6 +46,48 @@ func mustTag(t *testing.T, s string) name.Tag { return tag } +func TestDockerConfLocation(t *testing.T) { + dcfg := "DOCKER_CONFIG" + originalDockerConfig := os.Getenv(dcfg) + + if err := os.Unsetenv(dcfg); err != nil { + t.Fatalf("Failed to unset DOCKER_CONFIG: %v", err) + } + unset := DockerConfLocation() + unsetExpected := "/kaniko/.docker/config.json" // will fail on Windows + if unset != unsetExpected { + t.Errorf("Unexpected default Docker configuration file location: expected:'%s' got:'%s'", unsetExpected, unset) + } + + if err := os.Setenv(dcfg, "/kaniko/.docker"); err != nil { + t.Fatalf("Failed to set DOCKER_CONFIG: %v", err) + } + kanikoDefault := DockerConfLocation() + kanikoDefaultExpected := "/kaniko/.docker/config.json" // will fail on Windows + if kanikoDefault != kanikoDefaultExpected { + t.Errorf("Unexpected kaniko default Docker conf file location: expected:'%s' got:'%s'", kanikoDefaultExpected, kanikoDefault) + } + + if err := os.Setenv(dcfg, "/a/different/path"); err != nil { + t.Fatalf("Failed to set DOCKER_CONFIG: %v", err) + } + set := DockerConfLocation() + setExpected := "/a/different/path/config.json" // will fail on Windows + if set != setExpected { + t.Errorf("Unexpected DOCKER_CONF-based file location: expected:'%s' got:'%s'", setExpected, set) + } + + if originalDockerConfig != "" { + if err := os.Setenv(dcfg, originalDockerConfig); err != nil { + t.Fatalf("Failed to set DOCKER_CONFIG back to original value '%s': %v", originalDockerConfig, err) + } + } else { + if err := os.Unsetenv(dcfg); err != nil { + t.Fatalf("Failed to unset DOCKER_CONFIG after testing: %v", err) + } + } +} + func TestWriteImageOutputs(t *testing.T) { img, err := random.Image(1024, 3) if err != nil {