diff --git a/loader/loader.go b/loader/loader.go index acf11a954..2b5ab25b8 100644 --- a/loader/loader.go +++ b/loader/loader.go @@ -167,6 +167,13 @@ func Load(configDetails types.ConfigDetails, options ...func(*Options)) (*types. for i, file := range configDetails.ConfigFiles { configDict := file.Config if configDict == nil { + if len(file.Content) == 0 { + content, err := os.ReadFile(file.Filename) + if err != nil { + return nil, err + } + file.Content = content + } dict, err := parseConfig(file.Content, opts) if err != nil { return nil, err diff --git a/loader/loader_test.go b/loader/loader_test.go index f51c0e8a8..14217dcba 100644 --- a/loader/loader_test.go +++ b/loader/loader_test.go @@ -20,6 +20,7 @@ import ( "bytes" "fmt" "os" + "path/filepath" "sort" "strings" "testing" @@ -270,6 +271,32 @@ func TestLoad(t *testing.T) { assert.Check(t, is.DeepEqual(sampleConfig.Volumes, actual.Volumes)) } +func TestLoadFromFile(t *testing.T) { + workingDir, err := os.Getwd() + if err != nil { + t.Fatalf("os.Getwd(): %s", err) + } + tmpdir := t.TempDir() + tmpPath := filepath.Join(tmpdir, "Docker-compose.yaml") + if err := os.WriteFile(tmpPath, []byte(sampleYAML), 0444); err != nil { + t.Fatalf("failed to write temporary file: %s", err) + } + actual, err := Load(types.ConfigDetails{ + WorkingDir: workingDir, + ConfigFiles: []types.ConfigFile{{ + Filename: tmpPath, + }}, + Environment: nil, + }, func(options *Options) { + options.SkipNormalization = true + options.SkipConsistencyCheck = true + }) + assert.NilError(t, err) + assert.Check(t, is.DeepEqual(serviceSort(sampleConfig.Services), serviceSort(actual.Services))) + assert.Check(t, is.DeepEqual(sampleConfig.Networks, actual.Networks)) + assert.Check(t, is.DeepEqual(sampleConfig.Volumes, actual.Volumes)) +} + func TestLoadExtensions(t *testing.T) { actual, err := loadYAML(` services: