2015-05-15 19:34:26 -04:00
|
|
|
package daemon
|
|
|
|
|
|
|
|
import (
|
2015-11-18 17:20:54 -05:00
|
|
|
"encoding/json"
|
|
|
|
"errors"
|
2015-05-15 19:34:26 -04:00
|
|
|
"fmt"
|
2016-01-07 22:43:11 -05:00
|
|
|
"os"
|
2015-11-18 17:20:54 -05:00
|
|
|
"path/filepath"
|
|
|
|
"runtime"
|
|
|
|
"strings"
|
2015-05-15 19:34:26 -04:00
|
|
|
|
2015-09-22 19:05:00 -04:00
|
|
|
"github.com/Sirupsen/logrus"
|
2015-11-12 14:55:17 -05:00
|
|
|
"github.com/docker/docker/container"
|
2015-05-15 19:34:26 -04:00
|
|
|
"github.com/docker/docker/daemon/graphdriver"
|
2015-11-18 17:20:54 -05:00
|
|
|
"github.com/docker/docker/dockerversion"
|
|
|
|
"github.com/docker/docker/image"
|
|
|
|
"github.com/docker/docker/layer"
|
2015-12-04 16:55:15 -05:00
|
|
|
"github.com/docker/docker/reference"
|
2016-01-04 19:05:26 -05:00
|
|
|
containertypes "github.com/docker/engine-api/types/container"
|
2015-07-30 17:01:53 -04:00
|
|
|
// register the windows graph driver
|
2015-11-18 17:20:54 -05:00
|
|
|
"github.com/docker/docker/daemon/graphdriver/windows"
|
2016-01-07 22:43:11 -05:00
|
|
|
"github.com/docker/docker/pkg/idtools"
|
2015-10-15 14:40:14 -04:00
|
|
|
"github.com/docker/docker/pkg/system"
|
2015-05-15 19:34:26 -04:00
|
|
|
"github.com/docker/libnetwork"
|
2016-02-17 20:08:11 -05:00
|
|
|
nwconfig "github.com/docker/libnetwork/config"
|
2015-06-11 20:34:20 -04:00
|
|
|
blkiodev "github.com/opencontainers/runc/libcontainer/configs"
|
2015-05-15 19:34:26 -04:00
|
|
|
)
|
|
|
|
|
2015-08-07 12:33:29 -04:00
|
|
|
const (
|
2015-07-30 17:01:53 -04:00
|
|
|
defaultVirtualSwitch = "Virtual Switch"
|
2015-08-07 12:33:29 -04:00
|
|
|
platformSupported = true
|
2015-09-22 19:05:00 -04:00
|
|
|
windowsMinCPUShares = 1
|
2015-11-12 13:58:20 -05:00
|
|
|
windowsMaxCPUShares = 10000
|
2015-08-07 12:33:29 -04:00
|
|
|
)
|
2015-07-13 15:34:58 -04:00
|
|
|
|
2015-12-18 13:36:17 -05:00
|
|
|
func getBlkioWeightDevices(config *containertypes.HostConfig) ([]*blkiodev.WeightDevice, error) {
|
2015-06-11 20:34:20 -04:00
|
|
|
return nil, nil
|
|
|
|
}
|
|
|
|
|
2015-12-18 13:36:17 -05:00
|
|
|
func parseSecurityOpt(container *container.Container, config *containertypes.HostConfig) error {
|
2015-05-15 19:34:26 -04:00
|
|
|
return nil
|
|
|
|
}
|
|
|
|
|
2015-12-18 13:36:17 -05:00
|
|
|
func getBlkioReadIOpsDevices(config *containertypes.HostConfig) ([]*blkiodev.ThrottleDevice, error) {
|
2015-07-08 07:06:48 -04:00
|
|
|
return nil, nil
|
|
|
|
}
|
|
|
|
|
2015-12-18 13:36:17 -05:00
|
|
|
func getBlkioWriteIOpsDevices(config *containertypes.HostConfig) ([]*blkiodev.ThrottleDevice, error) {
|
2015-07-08 07:06:48 -04:00
|
|
|
return nil, nil
|
|
|
|
}
|
|
|
|
|
2015-12-18 13:36:17 -05:00
|
|
|
func getBlkioReadBpsDevices(config *containertypes.HostConfig) ([]*blkiodev.ThrottleDevice, error) {
|
2015-07-08 07:06:48 -04:00
|
|
|
return nil, nil
|
|
|
|
}
|
|
|
|
|
2015-12-18 13:36:17 -05:00
|
|
|
func getBlkioWriteBpsDevices(config *containertypes.HostConfig) ([]*blkiodev.ThrottleDevice, error) {
|
2015-07-08 07:06:48 -04:00
|
|
|
return nil, nil
|
|
|
|
}
|
|
|
|
|
2015-10-08 11:51:41 -04:00
|
|
|
func setupInitLayer(initLayer string, rootUID, rootGID int) error {
|
2015-05-15 19:34:26 -04:00
|
|
|
return nil
|
|
|
|
}
|
|
|
|
|
|
|
|
func checkKernel() error {
|
|
|
|
return nil
|
|
|
|
}
|
|
|
|
|
2015-07-30 18:28:11 -04:00
|
|
|
// adaptContainerSettings is called during container creation to modify any
|
|
|
|
// settings necessary in the HostConfig structure.
|
2015-12-18 13:36:17 -05:00
|
|
|
func (daemon *Daemon) adaptContainerSettings(hostConfig *containertypes.HostConfig, adjustCPUShares bool) error {
|
2015-09-24 15:10:41 -04:00
|
|
|
if hostConfig == nil {
|
2015-12-01 21:53:52 -05:00
|
|
|
return nil
|
2015-09-24 15:10:41 -04:00
|
|
|
}
|
|
|
|
|
2015-09-22 19:05:00 -04:00
|
|
|
if hostConfig.CPUShares < 0 {
|
|
|
|
logrus.Warnf("Changing requested CPUShares of %d to minimum allowed of %d", hostConfig.CPUShares, windowsMinCPUShares)
|
|
|
|
hostConfig.CPUShares = windowsMinCPUShares
|
|
|
|
} else if hostConfig.CPUShares > windowsMaxCPUShares {
|
|
|
|
logrus.Warnf("Changing requested CPUShares of %d to maximum allowed of %d", hostConfig.CPUShares, windowsMaxCPUShares)
|
|
|
|
hostConfig.CPUShares = windowsMaxCPUShares
|
|
|
|
}
|
2015-12-01 21:53:52 -05:00
|
|
|
|
|
|
|
return nil
|
2015-07-13 03:17:43 -04:00
|
|
|
}
|
|
|
|
|
2015-07-30 18:28:11 -04:00
|
|
|
// verifyPlatformContainerSettings performs platform-specific validation of the
|
|
|
|
// hostconfig and config structures.
|
2015-12-18 13:36:17 -05:00
|
|
|
func verifyPlatformContainerSettings(daemon *Daemon, hostConfig *containertypes.HostConfig, config *containertypes.Config) ([]string, error) {
|
2015-05-15 19:34:26 -04:00
|
|
|
return nil, nil
|
|
|
|
}
|
|
|
|
|
2016-01-22 21:15:09 -05:00
|
|
|
// verifyDaemonSettings performs validation of daemon config struct
|
|
|
|
func verifyDaemonSettings(config *Config) error {
|
2015-05-15 19:34:26 -04:00
|
|
|
return nil
|
|
|
|
}
|
|
|
|
|
2015-07-11 15:32:08 -04:00
|
|
|
// checkSystem validates platform-specific requirements
|
2015-05-15 19:34:26 -04:00
|
|
|
func checkSystem() error {
|
|
|
|
// Validate the OS version. Note that docker.exe must be manifested for this
|
|
|
|
// call to return the correct version.
|
2015-10-15 14:40:14 -04:00
|
|
|
osv, err := system.GetOSVersion()
|
2015-05-15 19:34:26 -04:00
|
|
|
if err != nil {
|
2015-10-15 14:40:14 -04:00
|
|
|
return err
|
2015-05-15 19:34:26 -04:00
|
|
|
}
|
2015-10-15 14:40:14 -04:00
|
|
|
if osv.MajorVersion < 10 {
|
2015-05-15 19:34:26 -04:00
|
|
|
return fmt.Errorf("This version of Windows does not support the docker daemon")
|
|
|
|
}
|
2015-11-11 17:47:02 -05:00
|
|
|
if osv.Build < 10586 {
|
|
|
|
return fmt.Errorf("The Windows daemon requires Windows Server 2016 Technical Preview 4, build 10586 or later")
|
|
|
|
}
|
2015-05-15 19:34:26 -04:00
|
|
|
return nil
|
|
|
|
}
|
|
|
|
|
|
|
|
// configureKernelSecuritySupport configures and validate security support for the kernel
|
|
|
|
func configureKernelSecuritySupport(config *Config, driverName string) error {
|
|
|
|
return nil
|
|
|
|
}
|
|
|
|
|
2015-12-02 05:26:30 -05:00
|
|
|
// configureMaxThreads sets the Go runtime max threads threshold
|
|
|
|
func configureMaxThreads(config *Config) error {
|
|
|
|
return nil
|
|
|
|
}
|
|
|
|
|
2015-06-30 13:34:15 -04:00
|
|
|
func isBridgeNetworkDisabled(config *Config) bool {
|
2015-05-15 19:34:26 -04:00
|
|
|
return false
|
|
|
|
}
|
|
|
|
|
2015-09-21 08:04:36 -04:00
|
|
|
func (daemon *Daemon) initNetworkController(config *Config) (libnetwork.NetworkController, error) {
|
2015-07-13 15:34:58 -04:00
|
|
|
// Set the name of the virtual switch if not specified by -b on daemon start
|
2016-01-25 16:30:33 -05:00
|
|
|
if config.bridgeConfig.VirtualSwitchName == "" {
|
|
|
|
config.bridgeConfig.VirtualSwitchName = defaultVirtualSwitch
|
2015-07-13 15:34:58 -04:00
|
|
|
}
|
2015-05-15 19:34:26 -04:00
|
|
|
return nil, nil
|
|
|
|
}
|
2015-06-23 13:13:42 -04:00
|
|
|
|
2015-07-30 17:01:53 -04:00
|
|
|
// registerLinks sets up links between containers and writes the
|
2015-11-16 00:32:31 -05:00
|
|
|
// configuration out for persistence. As of Windows TP4, links are not supported.
|
2015-12-18 13:36:17 -05:00
|
|
|
func (daemon *Daemon) registerLinks(container *container.Container, hostConfig *containertypes.HostConfig) error {
|
2015-06-23 13:13:42 -04:00
|
|
|
return nil
|
|
|
|
}
|
2015-07-16 17:14:58 -04:00
|
|
|
|
2015-08-03 18:05:34 -04:00
|
|
|
func (daemon *Daemon) cleanupMounts() error {
|
|
|
|
return nil
|
|
|
|
}
|
2015-11-02 20:06:09 -05:00
|
|
|
|
2016-01-07 22:43:11 -05:00
|
|
|
func setupRemappedRoot(config *Config) ([]idtools.IDMap, []idtools.IDMap, error) {
|
|
|
|
return nil, nil, nil
|
|
|
|
}
|
|
|
|
|
|
|
|
func setupDaemonRoot(config *Config, rootDir string, rootUID, rootGID int) error {
|
|
|
|
config.Root = rootDir
|
|
|
|
// Create the root directory if it doesn't exists
|
|
|
|
if err := system.MkdirAll(config.Root, 0700); err != nil && !os.IsExist(err) {
|
|
|
|
return err
|
|
|
|
}
|
|
|
|
return nil
|
|
|
|
}
|
|
|
|
|
2015-11-02 20:06:09 -05:00
|
|
|
// conditionalMountOnStart is a platform specific helper function during the
|
|
|
|
// container start to call mount.
|
2015-11-12 14:55:17 -05:00
|
|
|
func (daemon *Daemon) conditionalMountOnStart(container *container.Container) error {
|
2015-11-02 20:06:09 -05:00
|
|
|
// We do not mount if a Hyper-V container
|
2015-11-12 14:55:17 -05:00
|
|
|
if !container.HostConfig.Isolation.IsHyperV() {
|
2015-11-02 20:06:09 -05:00
|
|
|
if err := daemon.Mount(container); err != nil {
|
|
|
|
return err
|
|
|
|
}
|
|
|
|
}
|
|
|
|
return nil
|
|
|
|
}
|
|
|
|
|
|
|
|
// conditionalUnmountOnCleanup is a platform specific helper function called
|
|
|
|
// during the cleanup of a container to unmount.
|
2015-11-12 14:55:17 -05:00
|
|
|
func (daemon *Daemon) conditionalUnmountOnCleanup(container *container.Container) {
|
2015-11-02 20:06:09 -05:00
|
|
|
// We do not unmount if a Hyper-V container
|
2015-11-12 14:55:17 -05:00
|
|
|
if !container.HostConfig.Isolation.IsHyperV() {
|
2015-11-18 17:20:54 -05:00
|
|
|
daemon.Unmount(container)
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2015-12-16 15:32:16 -05:00
|
|
|
func restoreCustomImage(is image.Store, ls layer.Store, rs reference.Store) error {
|
|
|
|
type graphDriverStore interface {
|
|
|
|
GraphDriver() graphdriver.Driver
|
|
|
|
}
|
|
|
|
|
|
|
|
gds, ok := ls.(graphDriverStore)
|
|
|
|
if !ok {
|
|
|
|
return nil
|
|
|
|
}
|
|
|
|
|
|
|
|
driver := gds.GraphDriver()
|
|
|
|
wd, ok := driver.(*windows.Driver)
|
|
|
|
if !ok {
|
|
|
|
return nil
|
|
|
|
}
|
|
|
|
|
|
|
|
imageInfos, err := wd.GetCustomImageInfos()
|
|
|
|
if err != nil {
|
|
|
|
return err
|
|
|
|
}
|
|
|
|
|
|
|
|
// Convert imageData to valid image configuration
|
|
|
|
for i := range imageInfos {
|
|
|
|
name := strings.ToLower(imageInfos[i].Name)
|
|
|
|
|
|
|
|
type registrar interface {
|
|
|
|
RegisterDiffID(graphID string, size int64) (layer.Layer, error)
|
|
|
|
}
|
|
|
|
r, ok := ls.(registrar)
|
|
|
|
if !ok {
|
|
|
|
return errors.New("Layerstore doesn't support RegisterDiffID")
|
|
|
|
}
|
|
|
|
if _, err := r.RegisterDiffID(imageInfos[i].ID, imageInfos[i].Size); err != nil {
|
|
|
|
return err
|
|
|
|
}
|
|
|
|
// layer is intentionally not released
|
|
|
|
|
|
|
|
rootFS := image.NewRootFS()
|
|
|
|
rootFS.BaseLayer = filepath.Base(imageInfos[i].Path)
|
|
|
|
|
|
|
|
// Create history for base layer
|
|
|
|
config, err := json.Marshal(&image.Image{
|
|
|
|
V1Image: image.V1Image{
|
|
|
|
DockerVersion: dockerversion.Version,
|
|
|
|
Architecture: runtime.GOARCH,
|
|
|
|
OS: runtime.GOOS,
|
|
|
|
Created: imageInfos[i].CreatedTime,
|
|
|
|
},
|
|
|
|
RootFS: rootFS,
|
|
|
|
History: []image.History{},
|
|
|
|
})
|
|
|
|
|
|
|
|
named, err := reference.ParseNamed(name)
|
2015-11-18 17:20:54 -05:00
|
|
|
if err != nil {
|
|
|
|
return err
|
2015-11-02 20:06:09 -05:00
|
|
|
}
|
2015-11-18 17:20:54 -05:00
|
|
|
|
2015-12-16 15:32:16 -05:00
|
|
|
ref, err := reference.WithTag(named, imageInfos[i].Version)
|
|
|
|
if err != nil {
|
|
|
|
return err
|
2015-11-18 17:20:54 -05:00
|
|
|
}
|
|
|
|
|
2015-12-16 15:32:16 -05:00
|
|
|
id, err := is.Create(config)
|
|
|
|
if err != nil {
|
|
|
|
return err
|
|
|
|
}
|
|
|
|
|
|
|
|
if err := rs.AddTag(ref, id, true); err != nil {
|
|
|
|
return err
|
|
|
|
}
|
2015-11-18 17:20:54 -05:00
|
|
|
|
2015-12-16 15:32:16 -05:00
|
|
|
logrus.Debugf("Registered base layer %s as %s", ref, id)
|
|
|
|
}
|
2015-11-18 17:20:54 -05:00
|
|
|
return nil
|
2015-11-02 20:06:09 -05:00
|
|
|
}
|
2016-02-17 20:08:11 -05:00
|
|
|
|
|
|
|
func (daemon *Daemon) networkOptions(dconfig *Config) ([]nwconfig.Option, error) {
|
|
|
|
return nil, fmt.Errorf("Network controller config reload not aavailable on Windows yet")
|
|
|
|
}
|