1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253 |
- 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
- }
|