浏览代码

Merge pull request #21943 from Microsoft/jstarks/utilityvm

Windows: support embedded utility VM images
Alexander Morozov 9 年之前
父节点
当前提交
7b5a6844c2
共有 4 个文件被更改,包括 61 次插入28 次删除
  1. 33 15
      daemon/oci_windows.go
  2. 1 1
      hack/vendor.sh
  3. 11 8
      libcontainerd/client_windows.go
  4. 16 4
      vendor/src/github.com/Microsoft/hcsshim/baselayer.go

+ 33 - 15
daemon/oci_windows.go

@@ -1,7 +1,10 @@
 package daemon
 
 import (
+	"errors"
 	"fmt"
+	"os"
+	"path/filepath"
 	"syscall"
 
 	"github.com/docker/docker/container"
@@ -47,21 +50,6 @@ func (daemon *Daemon) createSpec(c *container.Container) (*libcontainerd.Spec, e
 		})
 	}
 
-	// Are we going to run as a Hyper-V container?
-	hv := false
-	if c.HostConfig.Isolation.IsDefault() {
-		// Container is set to use the default, so take the default from the daemon configuration
-		hv = daemon.defaultIsolation.IsHyperV()
-	} else {
-		// Container is requesting an isolation mode. Honour it.
-		hv = c.HostConfig.Isolation.IsHyperV()
-	}
-	if hv {
-		// TODO We don't yet have the ImagePath hooked up. But set to
-		// something non-nil to pickup in libcontainerd.
-		s.Windows.HvRuntime = &windowsoci.HvRuntime{}
-	}
-
 	// In s.Process
 	s.Process.Args = append([]string{c.Path}, c.Args...)
 	if !c.Config.ArgsEscaped {
@@ -109,6 +97,36 @@ func (daemon *Daemon) createSpec(c *container.Container) (*libcontainerd.Spec, e
 	}
 	s.Windows.LayerPaths = layerPaths
 
+	// Are we going to run as a Hyper-V container?
+	hv := false
+	if c.HostConfig.Isolation.IsDefault() {
+		// Container is set to use the default, so take the default from the daemon configuration
+		hv = daemon.defaultIsolation.IsHyperV()
+	} else {
+		// Container is requesting an isolation mode. Honour it.
+		hv = c.HostConfig.Isolation.IsHyperV()
+	}
+	if hv {
+		hvr := &windowsoci.HvRuntime{}
+		if img.RootFS != nil && img.RootFS.Type == image.TypeLayers {
+			// For TP5, the utility VM is part of the base layer.
+			// TODO-jstarks: Add support for separate utility VM images
+			// once it is decided how they can be stored.
+			uvmpath := filepath.Join(layerPaths[len(layerPaths)-1], "UtilityVM")
+			_, err = os.Stat(uvmpath)
+			if err != nil {
+				if os.IsNotExist(err) {
+					err = errors.New("container image does not contain a utility VM")
+				}
+				return nil, err
+			}
+
+			hvr.ImagePath = uvmpath
+		}
+
+		s.Windows.HvRuntime = hvr
+	}
+
 	// In s.Windows.Networking
 	// Connect all the libnetwork allocated networks to the container
 	var epList []string

+ 1 - 1
hack/vendor.sh

@@ -7,7 +7,7 @@ source 'hack/.vendor-helpers.sh'
 
 # the following lines are in sorted order, FYI
 clone git github.com/Azure/go-ansiterm 70b2c90b260171e829f1ebd7c17f600c11858dbe
-clone git github.com/Microsoft/hcsshim v0.2.0
+clone git github.com/Microsoft/hcsshim v0.2.1
 clone git github.com/Microsoft/go-winio v0.3.0
 clone git github.com/Sirupsen/logrus v0.9.0 # logrus is a common dependency among multiple deps
 clone git github.com/docker/libtrust 9cbd2a1374f46905c68a4eb3694a130610adc62a

+ 11 - 8
libcontainerd/client_windows.go

@@ -69,6 +69,10 @@ type mappedDir struct {
 	ReadOnly      bool
 }
 
+type hvRuntime struct {
+	ImagePath string `json:",omitempty"`
+}
+
 // TODO Windows: @darrenstahlmsft Add ProcessorCount
 type containerInit struct {
 	SystemType              string      // HCS requires this to be hard-coded to "Container"
@@ -91,6 +95,7 @@ type containerInit struct {
 	SandboxPath             string      // Location of unmounted sandbox (used for Hyper-V containers)
 	HvPartition             bool        // True if it a Hyper-V Container
 	EndpointList            []string    // List of networking endpoints to be attached to container
+	HvRuntime               *hvRuntime  // Hyper-V container settings
 }
 
 // defaultOwner is a tag passed to HCS to allow it to differentiate between
@@ -145,14 +150,12 @@ func (clnt *client) Create(containerID string, spec Spec, options ...CreateOptio
 		}
 	}
 
-	cu.HvPartition = (spec.Windows.HvRuntime != nil)
-
-	// TODO Windows @jhowardmsft. FIXME post TP5.
-	//	if spec.Windows.HvRuntime != nil {
-	//		if spec.WIndows.HVRuntime.ImagePath != "" {
-	//			cu.TBD = spec.Windows.HvRuntime.ImagePath
-	//		}
-	//	}
+	if spec.Windows.HvRuntime != nil {
+		cu.HvPartition = true
+		cu.HvRuntime = &hvRuntime{
+			ImagePath: spec.Windows.HvRuntime.ImagePath,
+		}
+	}
 
 	if cu.HvPartition {
 		cu.SandboxPath = filepath.Dir(spec.Windows.LayerFolder)

+ 16 - 4
vendor/src/github.com/Microsoft/hcsshim/baselayer.go

@@ -10,10 +10,11 @@ import (
 )
 
 type baseLayerWriter struct {
-	root string
-	f    *os.File
-	bw   *winio.BackupFileWriter
-	err  error
+	root         string
+	f            *os.File
+	bw           *winio.BackupFileWriter
+	err          error
+	hasUtilityVM bool
 }
 
 func (w *baseLayerWriter) closeCurrentFile() error {
@@ -44,6 +45,10 @@ func (w *baseLayerWriter) Add(name string, fileInfo *winio.FileBasicInfo) (err e
 		return err
 	}
 
+	if filepath.ToSlash(name) == `UtilityVM/Files` {
+		w.hasUtilityVM = true
+	}
+
 	path := filepath.Join(w.root, name)
 	path, err = makeLongAbsPath(path)
 	if err != nil {
@@ -139,6 +144,13 @@ func (w *baseLayerWriter) Close() error {
 		if err != nil {
 			return err
 		}
+
+		if w.hasUtilityVM {
+			err = ProcessUtilityVMImage(filepath.Join(w.root, "UtilityVM"))
+			if err != nil {
+				return err
+			}
+		}
 	}
 	return w.err
 }