diff --git a/cmd/root.go b/cmd/root.go index 30c29e8c..68c0a9f6 100644 --- a/cmd/root.go +++ b/cmd/root.go @@ -21,6 +21,8 @@ import ( log "github.com/sirupsen/logrus" "github.com/spf13/cobra" + "github.com/spf13/pflag" + "github.com/spf13/viper" ) // Logrus hooks @@ -80,6 +82,16 @@ var RootCmd = &cobra.Command{ if provider != "kubernetes" && provider != "openshift" { log.Fatalf("%s is an unsupported provider. Supported providers are: 'kubernetes', 'openshift'.", GlobalProvider) } + + v := viper.New() + v.BindEnv("file", "COMPOSE_FILE") + + cmd.Flags().VisitAll(func(f *pflag.Flag) { + configName := f.Name + if configName == "file" && !f.Changed && v.IsSet(configName) { + GlobalFiles = v.GetStringSlice(configName) + } + }) }, } @@ -93,6 +105,6 @@ func init() { RootCmd.PersistentFlags().BoolVarP(&GlobalVerbose, "verbose", "v", false, "verbose output") RootCmd.PersistentFlags().BoolVar(&GlobalSuppressWarnings, "suppress-warnings", false, "Suppress all warnings") RootCmd.PersistentFlags().BoolVar(&GlobalErrorOnWarning, "error-on-warning", false, "Treat any warning as an error") - RootCmd.PersistentFlags().StringArrayVarP(&GlobalFiles, "file", "f", []string{}, "Specify an alternative compose file") + RootCmd.PersistentFlags().StringSliceVarP(&GlobalFiles, "file", "f", []string{}, "Specify an alternative compose file") RootCmd.PersistentFlags().StringVar(&GlobalProvider, "provider", "kubernetes", "Specify a provider. Kubernetes or OpenShift.") } diff --git a/script/test/cmd/tests_new.sh b/script/test/cmd/tests_new.sh index fb425d91..56111310 100755 --- a/script/test/cmd/tests_new.sh +++ b/script/test/cmd/tests_new.sh @@ -310,3 +310,7 @@ convert::expect_success "$os_cmd" "$os_output" || exit 1 cmd="kompose -f $KOMPOSE_ROOT/script/test/fixtures/no-profile-warning/docker-compose.yaml convert" convert::expect_warning "$cmd" "No service selected. The profile specified in services of your compose yaml may not exist." || exit 1 +# Test COMPOSE_FILE env variable is honored +k8s_cmd="COMPOSE_FILE=\"$KOMPOSE_ROOT/script/test/fixtures/compose-file-env-variable/docker-compose.yaml $KOMPOSE_ROOT/script/test/fixtures/compose-file-env-variable/alternative-docker-compose.yaml\" kompose convert --stdout --with-kompose-annotation=false" +k8s_output="$KOMPOSE_ROOT/script/test/fixtures/fixtures/compose-file-env-variable/output-k8s.yaml" +convert::expect_success "$k8s_cmd" "$k8s_output" || exit 1 diff --git a/script/test/fixtures/compose-file-env-variable/alternative-docker-compose.yaml b/script/test/fixtures/compose-file-env-variable/alternative-docker-compose.yaml new file mode 100644 index 00000000..34584eee --- /dev/null +++ b/script/test/fixtures/compose-file-env-variable/alternative-docker-compose.yaml @@ -0,0 +1,7 @@ +version: "3" +services: + alpine: + image: alpine + ports: + - 80:80 + diff --git a/script/test/fixtures/compose-file-env-variable/docker-compose.yaml b/script/test/fixtures/compose-file-env-variable/docker-compose.yaml new file mode 100644 index 00000000..76349a4c --- /dev/null +++ b/script/test/fixtures/compose-file-env-variable/docker-compose.yaml @@ -0,0 +1,6 @@ +version: "3" +services: + debian: + image: debian + ports: + - 80:80 diff --git a/script/test/fixtures/compose-file-env-variable/output-k8s.yaml b/script/test/fixtures/compose-file-env-variable/output-k8s.yaml new file mode 100644 index 00000000..58d24c77 --- /dev/null +++ b/script/test/fixtures/compose-file-env-variable/output-k8s.yaml @@ -0,0 +1,94 @@ +--- +apiVersion: v1 +kind: Service +metadata: + creationTimestamp: null + labels: + io.kompose.service: alpine + name: alpine +spec: + ports: + - name: "80" + port: 80 + targetPort: 80 + selector: + io.kompose.service: alpine + +--- +apiVersion: v1 +kind: Service +metadata: + creationTimestamp: null + labels: + io.kompose.service: debian + name: debian +spec: + ports: + - name: "80" + port: 80 + targetPort: 80 + selector: + io.kompose.service: debian + +--- +apiVersion: apps/v1 +kind: Deployment +metadata: + creationTimestamp: null + labels: + io.kompose.service: alpine + name: alpine +spec: + replicas: 1 + selector: + matchLabels: + io.kompose.service: alpine + strategy: {} + template: + metadata: + creationTimestamp: null + labels: + io.kompose.network/compose-file-env-variable-default: "true" + io.kompose.service: alpine + spec: + containers: + - image: alpine + name: alpine + ports: + - containerPort: 80 + hostPort: 80 + protocol: TCP + resources: {} + restartPolicy: Always + +--- +apiVersion: apps/v1 +kind: Deployment +metadata: + creationTimestamp: null + labels: + io.kompose.service: debian + name: debian +spec: + replicas: 1 + selector: + matchLabels: + io.kompose.service: debian + strategy: {} + template: + metadata: + creationTimestamp: null + labels: + io.kompose.network/compose-file-env-variable-default: "true" + io.kompose.service: debian + spec: + containers: + - image: debian + name: debian + ports: + - containerPort: 80 + hostPort: 80 + protocol: TCP + resources: {} + restartPolicy: Always +