Allow DOCKER_CONFIG to be a filename (#1409)

* Allow DOCKER_CONFIG to be a filename

* UnitTest: DockerConfLocation must return a file if it is existent and passed using env, or default if the file is incorrect
This commit is contained in:
Akram Ben Aissi 2020-10-01 01:45:34 +02:00 committed by GitHub
parent b4824582fb
commit ab768b5d26
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
2 changed files with 88 additions and 14 deletions

View File

@ -67,8 +67,18 @@ const (
// "/kaniko/.docker/config.json". // "/kaniko/.docker/config.json".
func DockerConfLocation() string { func DockerConfLocation() string {
configFile := "config.json" configFile := "config.json"
if dockerConfDir := os.Getenv("DOCKER_CONFIG"); dockerConfDir != "" { if dockerConfig := os.Getenv("DOCKER_CONFIG"); dockerConfig != "" {
return filepath.Join(dockerConfDir, configFile) 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) return string(os.PathSeparator) + filepath.Join("kaniko", ".docker", configFile)
} }

View File

@ -37,6 +37,11 @@ import (
"github.com/spf13/afero" "github.com/spf13/afero"
) )
const (
DefaultKanikoDockerConfigJSON = "/kaniko/.docker/config.json"
DockerConfigEnvKey = "DOCKER_CONFIG"
)
func mustTag(t *testing.T, s string) name.Tag { func mustTag(t *testing.T, s string) name.Tag {
tag, err := name.NewTag(s, name.StrictValidation) tag, err := name.NewTag(s, name.StrictValidation)
if err != nil { if err != nil {
@ -45,43 +50,102 @@ func mustTag(t *testing.T, s string) name.Tag {
return tag return tag
} }
func TestDockerConfLocation(t *testing.T) { func TestDockerConfLocationWithFileLocation(t *testing.T) {
dcfg := "DOCKER_CONFIG" originalDockerConfig := os.Getenv(DockerConfigEnvKey)
originalDockerConfig := os.Getenv(dcfg) if err := os.Unsetenv(DockerConfigEnvKey); err != nil {
t.Fatalf("Failed to unset DOCKER_CONFIG: %v", err)
if err := os.Unsetenv(dcfg); err != nil { }
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) t.Fatalf("Failed to unset DOCKER_CONFIG: %v", err)
} }
unset := DockerConfLocation() unset := DockerConfLocation()
unsetExpected := "/kaniko/.docker/config.json" // will fail on Windows unsetExpected := file.Name()
if unset != unsetExpected { if unset != unsetExpected {
t.Errorf("Unexpected default Docker configuration file location: expected:'%s' got:'%s'", unsetExpected, unset) t.Errorf("Unexpected default Docker configuration file location: expected:'%s' got:'%s'", unsetExpected, unset)
} }
restoreOriginalDockerConfigEnv(t, originalDockerConfig)
}
if err := os.Setenv(dcfg, "/kaniko/.docker"); err != nil { 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) {
originalDockerConfig := os.Getenv(DockerConfigEnvKey)
if err := os.Unsetenv(DockerConfigEnvKey); err != nil {
t.Fatalf("Failed to unset DOCKER_CONFIG: %v", err)
}
unset := DockerConfLocation()
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)
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) t.Fatalf("Failed to set DOCKER_CONFIG: %v", err)
} }
kanikoDefault := DockerConfLocation() kanikoDefault := DockerConfLocation()
kanikoDefaultExpected := "/kaniko/.docker/config.json" // will fail on Windows kanikoDefaultExpected := filepath.Join(tmpDir, DefaultKanikoDockerConfigJSON) // will fail on Windows
if kanikoDefault != kanikoDefaultExpected { if kanikoDefault != kanikoDefaultExpected {
t.Errorf("Unexpected kaniko default Docker conf file location: expected:'%s' got:'%s'", kanikoDefaultExpected, kanikoDefault) 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) t.Fatalf("Failed to set DOCKER_CONFIG: %v", err)
} }
set := DockerConfLocation() 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 { if set != setExpected {
t.Errorf("Unexpected DOCKER_CONF-based file location: expected:'%s' got:'%s'", setExpected, set) 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 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) t.Fatalf("Failed to set DOCKER_CONFIG back to original value '%s': %v", originalDockerConfig, err)
} }
} else { } 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) t.Fatalf("Failed to unset DOCKER_CONFIG after testing: %v", err)
} }
} }