From e831ea826b1b204aed61cfbadfecdf5de4e8e212 Mon Sep 17 00:00:00 2001 From: Nicolas De Loof Date: Wed, 15 Feb 2023 14:30:09 +0100 Subject: [PATCH] add support for `restart` for `depends_on` Signed-off-by: Nicolas De Loof --- cmd/compose/compose.go | 21 ++++++++++++--------- cmd/compose/compose_test.go | 6 ++++-- docs/reference/compose.md | 2 +- docs/reference/docker_compose.yaml | 3 ++- go.mod | 2 +- go.sum | 4 ++-- pkg/compose/restart.go | 10 ++++++++++ 7 files changed, 32 insertions(+), 16 deletions(-) diff --git a/cmd/compose/compose.go b/cmd/compose/compose.go index 5bc062bcc..23879c324 100644 --- a/cmd/compose/compose.go +++ b/cmd/compose/compose.go @@ -99,7 +99,7 @@ type ProjectOptions struct { ConfigPaths []string WorkDir string ProjectDir string - EnvFile string + EnvFiles []string Compatibility bool } @@ -132,7 +132,7 @@ func (o *ProjectOptions) addProjectFlags(f *pflag.FlagSet) { f.StringArrayVar(&o.Profiles, "profile", []string{}, "Specify a profile to enable") f.StringVarP(&o.ProjectName, "project-name", "p", "", "Project name") f.StringArrayVarP(&o.ConfigPaths, "file", "f", []string{}, "Compose configuration files") - f.StringVar(&o.EnvFile, "env-file", "", "Specify an alternate environment file.") + f.StringArrayVar(&o.EnvFiles, "env-file", nil, "Specify an alternate environment file.") f.StringVar(&o.ProjectDir, "project-directory", "", "Specify an alternate working directory\n(default: the path of the, first specified, Compose file)") f.StringVar(&o.WorkDir, "workdir", "", "DEPRECATED! USE --project-directory INSTEAD.\nSpecify an alternate working directory\n(default: the path of the, first specified, Compose file)") f.BoolVar(&o.Compatibility, "compatibility", false, "Run compose in backward compatibility mode") @@ -198,8 +198,8 @@ func (o *ProjectOptions) ToProject(services []string, po ...cli.ProjectOptionsFn api.ConfigFilesLabel: strings.Join(project.ComposeFiles, ","), api.OneoffLabel: "False", // default, will be overridden by `run` command } - if o.EnvFile != "" { - s.CustomLabels[api.EnvironmentFileLabel] = o.EnvFile + if len(o.EnvFiles) != 0 { + s.CustomLabels[api.EnvironmentFileLabel] = strings.Join(o.EnvFiles, ",") } project.Services[i] = s } @@ -229,7 +229,7 @@ func (o *ProjectOptions) toProjectOptions(po ...cli.ProjectOptionsFn) (*cli.Proj append(po, cli.WithWorkingDirectory(o.ProjectDir), cli.WithOsEnv, - cli.WithEnvFile(o.EnvFile), + cli.WithEnvFiles(o.EnvFiles...), cli.WithDotEnv, cli.WithConfigFileEnv, cli.WithDefaultConfigPath, @@ -322,10 +322,13 @@ func RootCommand(streams command.Cli, backend api.Service) *cobra.Command { //no opts.ProjectDir = opts.WorkDir fmt.Fprint(os.Stderr, aec.Apply("option '--workdir' is DEPRECATED at root level! Please use '--project-directory' instead.\n", aec.RedF)) } - if opts.EnvFile != "" && !filepath.IsAbs(opts.EnvFile) { - opts.EnvFile, err = filepath.Abs(opts.EnvFile) - if err != nil { - return err + for i, file := range opts.EnvFiles { + if !filepath.IsAbs(file) { + file, err = filepath.Abs(file) + if err != nil { + return err + } + opts.EnvFiles[i] = file } } if v, ok := os.LookupEnv("COMPOSE_PARALLEL_LIMIT"); ok && !cmd.Flags().Changed("parallel") { diff --git a/cmd/compose/compose_test.go b/cmd/compose/compose_test.go index b19404424..1bbf4218e 100644 --- a/cmd/compose/compose_test.go +++ b/cmd/compose/compose_test.go @@ -31,8 +31,10 @@ func TestFilterServices(t *testing.T) { Links: []string{"bar"}, }, { - Name: "bar", - NetworkMode: types.NetworkModeServicePrefix + "zot", + Name: "bar", + DependsOn: map[string]types.ServiceDependency{ + "zot": {}, + }, }, { Name: "zot", diff --git a/docs/reference/compose.md b/docs/reference/compose.md index 242061ebe..46abdf076 100644 --- a/docs/reference/compose.md +++ b/docs/reference/compose.md @@ -41,7 +41,7 @@ Docker Compose |:-----------------------|:--------------|:--------|:----------------------------------------------------------------------------------------------------| | `--ansi` | `string` | `auto` | Control when to print ANSI control characters ("never"\|"always"\|"auto") | | `--compatibility` | | | Run compose in backward compatibility mode | -| `--env-file` | `string` | | Specify an alternate environment file. | +| `--env-file` | `stringArray` | | Specify an alternate environment file. | | `-f`, `--file` | `stringArray` | | Compose configuration files | | `--parallel` | `int` | `-1` | Control max parallelism, -1 for unlimited | | `--profile` | `stringArray` | | Specify a profile to enable | diff --git a/docs/reference/docker_compose.yaml b/docs/reference/docker_compose.yaml index c3ee6f33c..dcd3692bc 100644 --- a/docs/reference/docker_compose.yaml +++ b/docs/reference/docker_compose.yaml @@ -198,7 +198,8 @@ options: kubernetes: false swarm: false - option: env-file - value_type: string + value_type: stringArray + default_value: '[]' description: Specify an alternate environment file. deprecated: false hidden: false diff --git a/go.mod b/go.mod index edfda1634..ae3925a0e 100644 --- a/go.mod +++ b/go.mod @@ -5,7 +5,7 @@ go 1.20 require ( github.com/AlecAivazis/survey/v2 v2.3.6 github.com/buger/goterm v1.0.4 - github.com/compose-spec/compose-go v1.10.0 + github.com/compose-spec/compose-go v1.11.0 github.com/containerd/console v1.0.3 github.com/containerd/containerd v1.6.18 github.com/cucumber/godog v0.0.0-00010101000000-000000000000 diff --git a/go.sum b/go.sum index 9770350ce..0a861ec30 100644 --- a/go.sum +++ b/go.sum @@ -165,8 +165,8 @@ github.com/cncf/xds/go v0.0.0-20210805033703-aa0b78936158/go.mod h1:eXthEFrGJvWH github.com/cncf/xds/go v0.0.0-20210922020428-25de7278fc84/go.mod h1:eXthEFrGJvWHgFFCl3hGmgk+/aYT6PnTQLykKQRLhEs= github.com/cncf/xds/go v0.0.0-20211001041855-01bcc9b48dfe/go.mod h1:eXthEFrGJvWHgFFCl3hGmgk+/aYT6PnTQLykKQRLhEs= github.com/cncf/xds/go v0.0.0-20211011173535-cb28da3451f1/go.mod h1:eXthEFrGJvWHgFFCl3hGmgk+/aYT6PnTQLykKQRLhEs= -github.com/compose-spec/compose-go v1.10.0 h1:MGrEv+WyETQWB4ARKTHRTvoZ0CZGi8lyFlveGNMej40= -github.com/compose-spec/compose-go v1.10.0/go.mod h1:Tb5Ae2PsYN3GTqYqzl2IRbTPiJtPZZjMw8UKUvmehFk= +github.com/compose-spec/compose-go v1.11.0 h1:YLl0wf4YU9ZVei6mqLxAfI2gWOrqnTsPBAcIe9cO9Zk= +github.com/compose-spec/compose-go v1.11.0/go.mod h1:huuiqxbQTZLkagcN9D/1tEKZwMXVetYeIWtjCAVsoXw= github.com/containerd/cgroups v1.0.4 h1:jN/mbWBEaz+T1pi5OFtnkQ+8qnmEbAr1Oo1FRm5B0dA= github.com/containerd/console v1.0.3 h1:lIr7SlA5PxZyMV30bDW0MGbiOPXwc63yRuCP0ARubLw= github.com/containerd/console v1.0.3/go.mod h1:7LqA/THxQ86k76b8c/EMSiaJ3h1eZkMkXar0TQ1gf3U= diff --git a/pkg/compose/restart.go b/pkg/compose/restart.go index 86c88c144..b1dbff9bc 100644 --- a/pkg/compose/restart.go +++ b/pkg/compose/restart.go @@ -47,6 +47,16 @@ func (s *composeService) restart(ctx context.Context, projectName string, option } } + // ignore depends_on relations which are not impacted by restarting service + for i, service := range project.Services { + for name, r := range service.DependsOn { + if !r.Restart { + delete(service.DependsOn, name) + } + } + project.Services[i] = service + } + if len(options.Services) == 0 { err = project.ForServices(options.Services) if err != nil {