github.com/ssdev-go/moby@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 }