package daemon import ( "context" "github.com/docker/docker/container" "github.com/docker/docker/libcontainerd" "github.com/pkg/errors" "github.com/sirupsen/logrus" ) // postRunProcessing starts a servicing container if required func (daemon *Daemon) postRunProcessing(c *container.Container, ei libcontainerd.EventInfo) error { if ei.ExitCode == 0 && ei.UpdatePending { spec, err := daemon.createSpec(c) if err != nil { return err } // Turn on servicing spec.Windows.Servicing = true copts, err := daemon.getLibcontainerdCreateOptions(c) if err != nil { return err } // Create a new servicing container, which will start, complete the // update, and merge back the results if it succeeded, all as part of // the below function call. ctx := context.Background() svcID := c.ID + "_servicing" logger := logrus.WithField("container", svcID) if err := daemon.containerd.Create(ctx, svcID, spec, copts); err != nil { c.SetExitCode(-1) return errors.Wrap(err, "post-run update servicing failed") } _, err = daemon.containerd.Start(ctx, svcID, "", false, nil) if err != nil { logger.WithError(err).Warn("failed to run servicing container") if err := daemon.containerd.Delete(ctx, svcID); err != nil { logger.WithError(err).Warn("failed to delete servicing container") } } else { if _, _, err := daemon.containerd.DeleteTask(ctx, svcID); err != nil { logger.WithError(err).Warn("failed to delete servicing container task") } if err := daemon.containerd.Delete(ctx, svcID); err != nil { logger.WithError(err).Warn("failed to delete servicing container") } } } return nil }