monitor_windows.go 1.6 KB

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