diff --git a/daemon/monitor_windows.go b/daemon/monitor_windows.go index 0d4a818229..f4857d7f8a 100644 --- a/daemon/monitor_windows.go +++ b/daemon/monitor_windows.go @@ -22,13 +22,22 @@ func (daemon *Daemon) postRunProcessing(container *container.Container, e libcon return err } - servicingOption := &libcontainerd.ServicingOption{ + newOpts := []libcontainerd.CreateOption{&libcontainerd.ServicingOption{ IsServicing: true, + }} + + copts, err := daemon.getLibcontainerdCreateOptions(container) + if err != nil { + return err + } + + if copts != nil { + newOpts = append(newOpts, *copts...) } // 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. - if err := daemon.containerd.Create((container.ID + "_servicing"), "", "", *spec, servicingOption); err != nil { + if err := daemon.containerd.Create((container.ID + "_servicing"), "", "", *spec, newOpts...); err != nil { container.SetExitCode(-1) return fmt.Errorf("Post-run update servicing failed: %s", err) } diff --git a/daemon/start_windows.go b/daemon/start_windows.go index 160a57e860..8b9cae7629 100644 --- a/daemon/start_windows.go +++ b/daemon/start_windows.go @@ -30,10 +30,10 @@ func (daemon *Daemon) getLibcontainerdCreateOptions(container *container.Contain } if hvOpts.IsHyperV { hvOpts.SandboxPath = filepath.Dir(m["dir"]) - } else { - layerOpts.LayerFolderPath = m["dir"] } + layerOpts.LayerFolderPath = m["dir"] + // Generate the layer paths of the layer options img, err := daemon.imageStore.Get(container.ImageID) if err != nil { diff --git a/libcontainerd/client_windows.go b/libcontainerd/client_windows.go index 82f55a3ee2..3a4cae8fe0 100644 --- a/libcontainerd/client_windows.go +++ b/libcontainerd/client_windows.go @@ -40,15 +40,15 @@ const defaultOwner = "docker" // Create is the entrypoint to create a container from a spec, and if successfully // created, start it too. Table below shows the fields required for HCS JSON calling parameters, // where if not populated, is omitted. -// +-----------------+--------------------------------------------+--------------------------------------------+ -// | | Isolation=Process | Isolation=Hyper-V | -// +-----------------+--------------------------------------------+--------------------------------------------+ -// | VolumePath | \\?\\Volume{GUIDa} | | -// | LayerFolderPath | %root%\windowsfilter\containerID | | -// | Layers[] | ID=GUIDb;Path=%root%\windowsfilter\layerID | ID=GUIDb;Path=%root%\windowsfilter\layerID | -// | SandboxPath | | %root%\windowsfilter | -// | HvRuntime | | ImagePath=%root%\BaseLayerID\UtilityVM | -// +-----------------+--------------------------------------------+--------------------------------------------+ +// +-----------------+--------------------------------------------+---------------------------------------------------+ +// | | Isolation=Process | Isolation=Hyper-V | +// +-----------------+--------------------------------------------+---------------------------------------------------+ +// | VolumePath | \\?\\Volume{GUIDa} | | +// | LayerFolderPath | %root%\windowsfilter\containerID | %root%\windowsfilter\containerID (servicing only) | +// | Layers[] | ID=GUIDb;Path=%root%\windowsfilter\layerID | ID=GUIDb;Path=%root%\windowsfilter\layerID | +// | SandboxPath | | %root%\windowsfilter | +// | HvRuntime | | ImagePath=%root%\BaseLayerID\UtilityVM | +// +-----------------+--------------------------------------------+---------------------------------------------------+ // // Isolation=Process example: // @@ -183,9 +183,10 @@ func (clnt *client) Create(containerID string, checkpoint string, checkpointDir configuration.HvRuntime = &hcsshim.HvRuntime{ImagePath: uvmImagePath} } else { configuration.VolumePath = spec.Root.Path - configuration.LayerFolderPath = layerOpt.LayerFolderPath } + configuration.LayerFolderPath = layerOpt.LayerFolderPath + for _, layerPath := range layerOpt.LayerPaths { _, filename := filepath.Split(layerPath) g, err := hcsshim.NameToGuid(filename)