daemon/monitor_windows.go
94d70d83
 package daemon
 
 import (
ddae20c0
 	"context"
818a5198
 
94d70d83
 	"github.com/docker/docker/container"
 	"github.com/docker/docker/libcontainerd"
ddae20c0
 	"github.com/pkg/errors"
 	"github.com/sirupsen/logrus"
94d70d83
 )
 
ddae20c0
 // 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)
da92dad5
 		if err != nil {
 			return err
 		}
7c29103a
 		// Turn on servicing
 		spec.Windows.Servicing = true
78540d0d
 
ddae20c0
 		copts, err := daemon.getLibcontainerdCreateOptions(c)
78540d0d
 		if err != nil {
 			return err
 		}
 
ddae20c0
 		// 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")
 			}
da92dad5
 		}
818a5198
 	}
 	return nil
 }