@@ -28,7 +28,12 @@ import (
2828)
2929
3030func main () {
31- ctx := context .Background ()
31+ baseCtx , cancel := context .WithCancel (context .Background ())
32+ defer cancel ()
33+
34+ ctx , cancelNotify := signal .NotifyContext (baseCtx , platformsignals .TerminationSignals ... )
35+ defer cancelNotify ()
36+
3237 dockerCli , err := command .NewDockerCli (command .WithBaseContext (ctx ))
3338 if err != nil {
3439 fmt .Fprintln (os .Stderr , err )
@@ -223,7 +228,7 @@ func setValidateArgs(dockerCli command.Cli, cmd *cobra.Command) {
223228 })
224229}
225230
226- func tryPluginRun (dockerCli command.Cli , cmd * cobra.Command , subcommand string , envs []string ) error {
231+ func tryPluginRun (ctx context. Context , dockerCli command.Cli , cmd * cobra.Command , subcommand string , envs []string ) error {
227232 plugincmd , err := pluginmanager .PluginRunCommand (dockerCli , subcommand , cmd )
228233 if err != nil {
229234 return err
@@ -241,11 +246,15 @@ func tryPluginRun(dockerCli command.Cli, cmd *cobra.Command, subcommand string,
241246
242247 // Background signal handling logic: block on the signals channel, and
243248 // notify the plugin via the PluginServer (or signal) as appropriate.
244- const exitLimit = 3
245- signals := make (chan os.Signal , exitLimit )
246- signal .Notify (signals , platformsignals .TerminationSignals ... )
249+ const exitLimit = 2
250+
247251 go func () {
248252 retries := 0
253+ <- ctx .Done ()
254+
255+ signals := make (chan os.Signal , exitLimit )
256+ signal .Notify (signals , platformsignals .TerminationSignals ... )
257+
249258 for range signals {
250259 // If stdin is a TTY, the kernel will forward
251260 // signals to the subprocess because the shared
@@ -333,7 +342,7 @@ func runDocker(ctx context.Context, dockerCli *command.DockerCli) error {
333342 ccmd , _ , err := cmd .Find (args )
334343 subCommand = ccmd
335344 if err != nil || pluginmanager .IsPluginCommand (ccmd ) {
336- err := tryPluginRun (dockerCli , cmd , args [0 ], envs )
345+ err := tryPluginRun (ctx , dockerCli , cmd , args [0 ], envs )
337346 if err == nil {
338347 if dockerCli .HooksEnabled () && dockerCli .Out ().IsTerminal () && ccmd != nil {
339348 _ = pluginmanager .RunPluginHooks (dockerCli , cmd , ccmd , args [0 ], args )
0 commit comments