github.com/sams1990/dockerrepo@v17.12.1-ce-rc2+incompatible/daemon/monitor_windows.go (about)

     1  package daemon
     2  
     3  import (
     4  	"context"
     5  
     6  	"github.com/docker/docker/container"
     7  	"github.com/docker/docker/libcontainerd"
     8  	"github.com/pkg/errors"
     9  	"github.com/sirupsen/logrus"
    10  )
    11  
    12  // postRunProcessing starts a servicing container if required
    13  func (daemon *Daemon) postRunProcessing(c *container.Container, ei libcontainerd.EventInfo) error {
    14  	if ei.ExitCode == 0 && ei.UpdatePending {
    15  		spec, err := daemon.createSpec(c)
    16  		if err != nil {
    17  			return err
    18  		}
    19  		// Turn on servicing
    20  		spec.Windows.Servicing = true
    21  
    22  		copts, err := daemon.getLibcontainerdCreateOptions(c)
    23  		if err != nil {
    24  			return err
    25  		}
    26  
    27  		// Create a new servicing container, which will start, complete the
    28  		// update, and merge back the results if it succeeded, all as part of
    29  		// the below function call.
    30  		ctx := context.Background()
    31  		svcID := c.ID + "_servicing"
    32  		logger := logrus.WithField("container", svcID)
    33  		if err := daemon.containerd.Create(ctx, svcID, spec, copts); err != nil {
    34  			c.SetExitCode(-1)
    35  			return errors.Wrap(err, "post-run update servicing failed")
    36  		}
    37  		_, err = daemon.containerd.Start(ctx, svcID, "", false, nil)
    38  		if err != nil {
    39  			logger.WithError(err).Warn("failed to run servicing container")
    40  			if err := daemon.containerd.Delete(ctx, svcID); err != nil {
    41  				logger.WithError(err).Warn("failed to delete servicing container")
    42  			}
    43  		} else {
    44  			if _, _, err := daemon.containerd.DeleteTask(ctx, svcID); err != nil {
    45  				logger.WithError(err).Warn("failed to delete servicing container task")
    46  			}
    47  			if err := daemon.containerd.Delete(ctx, svcID); err != nil {
    48  				logger.WithError(err).Warn("failed to delete servicing container")
    49  			}
    50  		}
    51  	}
    52  	return nil
    53  }