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:
parent
b4824582fb
commit
ab768b5d26
|
|
@ -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)
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -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)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue