diff --git a/pkg/executor/push.go b/pkg/executor/push.go index 0232abbc56..f855060e6a 100644 --- a/pkg/executor/push.go +++ b/pkg/executor/push.go @@ -66,8 +66,18 @@ const ( // "/kaniko/.docker/config.json". func DockerConfLocation() string { configFile := "config.json" - if dockerConfDir := os.Getenv("DOCKER_CONFIG"); dockerConfDir != "" { - return filepath.Join(dockerConfDir, configFile) + if dockerConfig := os.Getenv("DOCKER_CONFIG"); dockerConfig != "" { + file, err := os.Stat(dockerConfig) + if err == nil { + if file.IsDir() { + return filepath.Join(dockerConfig, configFile) + } + } else { + if os.IsNotExist(err) { + return string(os.PathSeparator) + filepath.Join("kaniko", ".docker", configFile) + } + } + return filepath.Clean(dockerConfig) } return string(os.PathSeparator) + filepath.Join("kaniko", ".docker", configFile) } diff --git a/pkg/executor/push_test.go b/pkg/executor/push_test.go index f7699ce192..53475fe3ec 100644 --- a/pkg/executor/push_test.go +++ b/pkg/executor/push_test.go @@ -37,6 +37,11 @@ import ( "github.com/spf13/afero" ) +const ( + DefaultKanikoDockerConfigJSON = "/kaniko/.docker/config.json" + DockerConfigEnvKey = "DOCKER_CONFIG" +) + func mustTag(t *testing.T, s string) name.Tag { tag, err := name.NewTag(s, name.StrictValidation) if err != nil { @@ -45,43 +50,102 @@ func mustTag(t *testing.T, s string) name.Tag { return tag } +func TestDockerConfLocationWithFileLocation(t *testing.T) { + originalDockerConfig := os.Getenv(DockerConfigEnvKey) + if err := os.Unsetenv(DockerConfigEnvKey); err != nil { + t.Fatalf("Failed to unset DOCKER_CONFIG: %v", err) + } + file, err := ioutil.TempFile("", "docker.conf") + if err != nil { + t.Fatalf("could not create temp file: %s", err) + } + defer os.Remove(file.Name()) + if err := os.Setenv(DockerConfigEnvKey, file.Name()); err != nil { + t.Fatalf("Failed to unset DOCKER_CONFIG: %v", err) + } + unset := DockerConfLocation() + unsetExpected := file.Name() + if unset != unsetExpected { + t.Errorf("Unexpected default Docker configuration file location: expected:'%s' got:'%s'", unsetExpected, unset) + } + restoreOriginalDockerConfigEnv(t, originalDockerConfig) +} + +func TestDockerConfLocationWithInvalidFileLocation(t *testing.T) { + originalDockerConfig := os.Getenv(DockerConfigEnvKey) + if err := os.Unsetenv(DockerConfigEnvKey); err != nil { + t.Fatalf("Failed to unset DOCKER_CONFIG: %v", err) + } + tmpDir, err := ioutil.TempDir("", "*") + if err != nil { + t.Fatalf("could not create temp dir: %s", err) + } + defer os.RemoveAll(tmpDir) + random := "fdgdsfrdfgdf-fdfsf-24dsgfd" //replace with a really random string + file := filepath.Join(tmpDir, random) // an random file name, shouldn't exist + if err := os.Setenv(DockerConfigEnvKey, file); err != nil { + t.Fatalf("Failed to unset DOCKER_CONFIG: %v", err) + } + unset := DockerConfLocation() + // as file doesn't point to a real file, DockerConfLocation() should return the default kaniko path for config.json + unsetExpected := DefaultKanikoDockerConfigJSON + if unset != unsetExpected { + t.Errorf("Unexpected default Docker configuration file location: expected:'%s' got:'%s'", unsetExpected, unset) + } + restoreOriginalDockerConfigEnv(t, originalDockerConfig) +} + func TestDockerConfLocation(t *testing.T) { - dcfg := "DOCKER_CONFIG" - originalDockerConfig := os.Getenv(dcfg) + originalDockerConfig := os.Getenv(DockerConfigEnvKey) - if err := os.Unsetenv(dcfg); err != nil { + if err := os.Unsetenv(DockerConfigEnvKey); err != nil { t.Fatalf("Failed to unset DOCKER_CONFIG: %v", err) } unset := DockerConfLocation() - unsetExpected := "/kaniko/.docker/config.json" // will fail on Windows + unsetExpected := DefaultKanikoDockerConfigJSON // will fail on Windows if unset != unsetExpected { t.Errorf("Unexpected default Docker configuration file location: expected:'%s' got:'%s'", unsetExpected, unset) } + tmpDir, err := ioutil.TempDir("", "*") + if err != nil { + t.Fatalf("could not create temp dir: %s", err) + } + defer os.RemoveAll(tmpDir) - if err := os.Setenv(dcfg, "/kaniko/.docker"); err != nil { + dir := filepath.Join(tmpDir, "/kaniko/.docker") + os.MkdirAll(dir, os.ModePerm) + if err := os.Setenv(DockerConfigEnvKey, dir); err != nil { t.Fatalf("Failed to set DOCKER_CONFIG: %v", err) } kanikoDefault := DockerConfLocation() - kanikoDefaultExpected := "/kaniko/.docker/config.json" // will fail on Windows + kanikoDefaultExpected := filepath.Join(tmpDir, DefaultKanikoDockerConfigJSON) // 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 { + differentPath, err := ioutil.TempDir("", "differentPath") + if err != nil { + t.Fatalf("could not create temp dir: %s", err) + } + defer os.RemoveAll(differentPath) + if err := os.Setenv(DockerConfigEnvKey, differentPath); err != nil { t.Fatalf("Failed to set DOCKER_CONFIG: %v", err) } set := DockerConfLocation() - setExpected := "/a/different/path/config.json" // will fail on Windows + setExpected := filepath.Join(differentPath, "config.json") // will fail on Windows ? if set != setExpected { t.Errorf("Unexpected DOCKER_CONF-based file location: expected:'%s' got:'%s'", setExpected, set) } + restoreOriginalDockerConfigEnv(t, originalDockerConfig) +} +func restoreOriginalDockerConfigEnv(t *testing.T, originalDockerConfig string) { if originalDockerConfig != "" { - if err := os.Setenv(dcfg, originalDockerConfig); err != nil { + if err := os.Setenv(DockerConfigEnvKey, 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 { + if err := os.Unsetenv(DockerConfigEnvKey); err != nil { t.Fatalf("Failed to unset DOCKER_CONFIG after testing: %v", err) } }