Skip to content
This repository was archived by the owner on Jul 18, 2025. It is now read-only.

Commit a5a9076

Browse files
Merge pull request #246 from shin-/check-compose-file-version
Check that Compose file version is supported during init
2 parents de9bd1e + 5f46ca7 commit a5a9076

2 files changed

Lines changed: 58 additions & 1 deletion

File tree

internal/packager/init.go

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,7 @@ import (
1515
"github.com/docker/app/internal/render"
1616
"github.com/docker/app/internal/types"
1717
"github.com/docker/cli/cli/compose/loader"
18+
"github.com/docker/cli/cli/compose/schema"
1819
dtemplate "github.com/docker/cli/cli/compose/template"
1920
"github.com/docker/cli/opts"
2021
"github.com/pkg/errors"
@@ -106,6 +107,14 @@ func initFromScratch(name string) error {
106107
return ioutil.WriteFile(filepath.Join(dirName, internal.SettingsFileName), []byte{'\n'}, 0644)
107108
}
108109

110+
func checkComposeFileVersion(compose map[string]interface{}) error {
111+
version, ok := compose["version"]
112+
if !ok {
113+
return fmt.Errorf("unsupported Compose file version: version 1 is too low")
114+
}
115+
return schema.Validate(compose, fmt.Sprintf("%v", version))
116+
}
117+
109118
func initFromComposeFile(name string, composeFile string) error {
110119
log.Debug("init from compose")
111120

@@ -119,6 +128,9 @@ func initFromComposeFile(name string, composeFile string) error {
119128
if err != nil {
120129
return errors.Wrap(err, "failed to parse compose file")
121130
}
131+
if err := checkComposeFileVersion(cfgMap); err != nil {
132+
return err
133+
}
122134
settings := make(map[string]string)
123135
envs, err := opts.ParseEnvFile(filepath.Join(filepath.Dir(composeFile), ".env"))
124136
if err == nil {

internal/packager/init_test.go

Lines changed: 46 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -23,7 +23,9 @@ func randomName(prefix string) string {
2323
}
2424

2525
func TestInitFromComposeFile(t *testing.T) {
26-
composeData := `services:
26+
composeData := `
27+
version: '3.0'
28+
services:
2729
nginx:
2830
image: nginx:${NGINX_VERSION}
2931
command: nginx $NGINX_ARGS
@@ -65,6 +67,49 @@ func TestInitFromInvalidComposeFile(t *testing.T) {
6567
assert.ErrorContains(t, err, "failed to read")
6668
}
6769

70+
func TestInitFromV2ComposeFile(t *testing.T) {
71+
composeData := `
72+
version: '2.4'
73+
services:
74+
nginx:
75+
image: nginx:${NGINX_VERSION}
76+
command: nginx $NGINX_ARGS
77+
`
78+
inputDir := randomName("app_input_")
79+
os.Mkdir(inputDir, 0755)
80+
ioutil.WriteFile(filepath.Join(inputDir, "docker-compose.yml"), []byte(composeData), 0644)
81+
defer os.RemoveAll(inputDir)
82+
83+
testAppName := randomName("app_")
84+
dirName := internal.DirNameFromAppName(testAppName)
85+
err := os.Mkdir(dirName, 0755)
86+
assert.NilError(t, err)
87+
defer os.RemoveAll(dirName)
88+
89+
err = initFromComposeFile(testAppName, filepath.Join(inputDir, "docker-compose.yml"))
90+
assert.ErrorContains(t, err, "unsupported Compose file version")
91+
}
92+
93+
func TestInitFromV1ComposeFile(t *testing.T) {
94+
composeData := `
95+
nginx:
96+
image: nginx
97+
`
98+
inputDir := randomName("app_input_")
99+
os.Mkdir(inputDir, 0755)
100+
ioutil.WriteFile(filepath.Join(inputDir, "docker-compose.yml"), []byte(composeData), 0644)
101+
defer os.RemoveAll(inputDir)
102+
103+
testAppName := randomName("app_")
104+
dirName := internal.DirNameFromAppName(testAppName)
105+
err := os.Mkdir(dirName, 0755)
106+
assert.NilError(t, err)
107+
defer os.RemoveAll(dirName)
108+
109+
err = initFromComposeFile(testAppName, filepath.Join(inputDir, "docker-compose.yml"))
110+
assert.ErrorContains(t, err, "unsupported Compose file version")
111+
}
112+
68113
func TestWriteMetadataFile(t *testing.T) {
69114
appName := "writemetadata_test"
70115
tmpdir := fs.NewDir(t, appName)

0 commit comments

Comments
 (0)