From 2858911c1c53a0fbc870bcd56d9cde60db074019 Mon Sep 17 00:00:00 2001 From: Nicolas De Loof Date: Tue, 23 Feb 2021 14:03:15 +0100 Subject: [PATCH] add --timeout option to compose up Signed-off-by: Nicolas De Loof --- cli/cmd/compose/up.go | 13 +++++++++++++ 1 file changed, 13 insertions(+) diff --git a/cli/cmd/compose/up.go b/cli/cmd/compose/up.go index a52ffb09b..d6057b8ca 100644 --- a/cli/cmd/compose/up.go +++ b/cli/cmd/compose/up.go @@ -25,6 +25,7 @@ import ( "strconv" "strings" "syscall" + "time" "github.com/docker/compose-cli/api/client" "github.com/docker/compose-cli/api/compose" @@ -60,6 +61,8 @@ type upOptions struct { scale []string noColor bool noPrefix bool + timeChanged bool + timeout int } func (o upOptions) recreateStrategy() string { @@ -82,6 +85,7 @@ func upCommand(p *projectOptions, contextType string) *cobra.Command { Use: "up [SERVICE...]", Short: "Create and start containers", RunE: func(cmd *cobra.Command, args []string) error { + opts.timeChanged = cmd.Flags().Changed("timeout") switch contextType { case store.LocalContextType, store.DefaultContextType, store.EcsLocalSimulationContextType: if opts.exitCodeFrom != "" { @@ -117,6 +121,7 @@ func upCommand(p *projectOptions, contextType string) *cobra.Command { flags.BoolVar(&opts.noStart, "no-start", false, "Don't start the services after creating them.") flags.BoolVar(&opts.cascadeStop, "abort-on-container-exit", false, "Stops all containers if any container was stopped. Incompatible with -d") flags.StringVar(&opts.exitCodeFrom, "exit-code-from", "", "Return the exit code of the selected service container. Implies --abort-on-container-exit") + flags.IntVarP(&opts.timeout, "timeout", "t", 10, "Use this timeout in seconds for container shutdown when attached or when containers are already running.") } return upCmd @@ -159,6 +164,14 @@ func runCreateStart(ctx context.Context, opts upOptions, services []string) erro } } + if opts.timeChanged { + timeoutValue := types.Duration(time.Duration(opts.timeout) * time.Second) + for i, s := range project.Services { + s.StopGracePeriod = &timeoutValue + project.Services[i] = s + } + } + _, err = progress.Run(ctx, func(ctx context.Context) (string, error) { err := c.ComposeService().Create(ctx, project, compose.CreateOptions{ RemoveOrphans: opts.removeOrphans,