2015-11-12 19:55:17 +00:00
|
|
|
// +build windows
|
|
|
|
|
|
|
|
package container
|
|
|
|
|
|
|
|
import (
|
2016-01-04 15:58:20 +00:00
|
|
|
"fmt"
|
2016-01-27 21:03:09 +00:00
|
|
|
"os"
|
|
|
|
"path/filepath"
|
|
|
|
|
2016-09-06 18:18:12 +00:00
|
|
|
containertypes "github.com/docker/docker/api/types/container"
|
2016-05-04 18:06:54 +00:00
|
|
|
"github.com/docker/docker/utils"
|
2015-11-12 19:55:17 +00:00
|
|
|
)
|
|
|
|
|
|
|
|
// Container holds fields specific to the Windows implementation. See
|
|
|
|
// CommonContainer for standard fields common to all containers.
|
|
|
|
type Container struct {
|
|
|
|
CommonContainer
|
|
|
|
|
|
|
|
// Fields below here are platform specific.
|
|
|
|
}
|
|
|
|
|
2016-03-18 18:53:27 +00:00
|
|
|
// ExitStatus provides exit reasons for a container.
|
|
|
|
type ExitStatus struct {
|
|
|
|
// The exit code with which the container exited.
|
|
|
|
ExitCode int
|
|
|
|
}
|
|
|
|
|
2015-11-12 19:55:17 +00:00
|
|
|
// CreateDaemonEnvironment creates a new environment variable slice for this container.
|
2016-09-28 22:21:33 +00:00
|
|
|
func (container *Container) CreateDaemonEnvironment(_ bool, linkedEnv []string) []string {
|
2016-05-04 18:06:54 +00:00
|
|
|
// because the env on the container can override certain default values
|
|
|
|
// we need to replace the 'env' keys where they match and append anything
|
|
|
|
// else.
|
|
|
|
return utils.ReplaceOrAppendEnvValues(linkedEnv, container.Config.Env)
|
2015-11-12 19:55:17 +00:00
|
|
|
}
|
|
|
|
|
2016-09-04 07:17:58 +00:00
|
|
|
// UnmountIpcMounts unmounts Ipc related mounts.
|
2015-11-12 19:55:17 +00:00
|
|
|
// This is a NOOP on windows.
|
|
|
|
func (container *Container) UnmountIpcMounts(unmount func(pth string) error) {
|
|
|
|
}
|
|
|
|
|
|
|
|
// IpcMounts returns the list of Ipc related mounts.
|
2016-03-18 18:53:27 +00:00
|
|
|
func (container *Container) IpcMounts() []Mount {
|
2015-11-12 19:55:17 +00:00
|
|
|
return nil
|
|
|
|
}
|
|
|
|
|
2016-10-27 20:51:13 +00:00
|
|
|
// SecretMount returns the mount for the secret path
|
|
|
|
func (container *Container) SecretMount() *Mount {
|
|
|
|
return nil
|
|
|
|
}
|
|
|
|
|
|
|
|
// UnmountSecrets unmounts the fs for secrets
|
|
|
|
func (container *Container) UnmountSecrets() error {
|
|
|
|
return nil
|
|
|
|
}
|
|
|
|
|
2016-10-03 17:53:06 +00:00
|
|
|
// DetachAndUnmount unmounts all volumes.
|
|
|
|
// On Windows it only delegates to `UnmountVolumes` since there is nothing to
|
|
|
|
// force unmount.
|
|
|
|
func (container *Container) DetachAndUnmount(volumeEventLog func(name, action string, attributes map[string]string)) error {
|
|
|
|
return container.UnmountVolumes(volumeEventLog)
|
2015-11-12 19:55:17 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
// TmpfsMounts returns the list of tmpfs mounts
|
2016-09-22 20:14:15 +00:00
|
|
|
func (container *Container) TmpfsMounts() ([]Mount, error) {
|
2016-06-06 09:57:11 +00:00
|
|
|
var mounts []Mount
|
2016-09-22 20:14:15 +00:00
|
|
|
return mounts, nil
|
2015-11-12 19:55:17 +00:00
|
|
|
}
|
|
|
|
|
2016-01-04 15:58:20 +00:00
|
|
|
// UpdateContainer updates configuration of a container
|
2016-03-01 18:23:43 +00:00
|
|
|
func (container *Container) UpdateContainer(hostConfig *containertypes.HostConfig) error {
|
2016-01-04 15:58:20 +00:00
|
|
|
container.Lock()
|
|
|
|
defer container.Unlock()
|
|
|
|
resources := hostConfig.Resources
|
|
|
|
if resources.BlkioWeight != 0 || resources.CPUShares != 0 ||
|
|
|
|
resources.CPUPeriod != 0 || resources.CPUQuota != 0 ||
|
|
|
|
resources.CpusetCpus != "" || resources.CpusetMems != "" ||
|
|
|
|
resources.Memory != 0 || resources.MemorySwap != 0 ||
|
|
|
|
resources.MemoryReservation != 0 || resources.KernelMemory != 0 {
|
|
|
|
return fmt.Errorf("Resource updating isn't supported on Windows")
|
|
|
|
}
|
|
|
|
// update HostConfig of container
|
|
|
|
if hostConfig.RestartPolicy.Name != "" {
|
2016-08-15 08:38:47 +00:00
|
|
|
if container.HostConfig.AutoRemove && !hostConfig.RestartPolicy.IsNone() {
|
|
|
|
return fmt.Errorf("Restart policy cannot be updated because AutoRemove is enabled for the container")
|
|
|
|
}
|
2016-01-04 15:58:20 +00:00
|
|
|
container.HostConfig.RestartPolicy = hostConfig.RestartPolicy
|
|
|
|
}
|
2015-12-28 11:19:26 +00:00
|
|
|
return nil
|
|
|
|
}
|
|
|
|
|
2016-01-27 21:03:09 +00:00
|
|
|
// cleanResourcePath cleans a resource path by removing C:\ syntax, and prepares
|
|
|
|
// to combine with a volume path
|
|
|
|
func cleanResourcePath(path string) string {
|
|
|
|
if len(path) >= 2 {
|
|
|
|
c := path[0]
|
|
|
|
if path[1] == ':' && ('a' <= c && c <= 'z' || 'A' <= c && c <= 'Z') {
|
|
|
|
path = path[2:]
|
|
|
|
}
|
|
|
|
}
|
|
|
|
return filepath.Join(string(os.PathSeparator), path)
|
|
|
|
}
|
2016-03-01 18:23:43 +00:00
|
|
|
|
2016-03-10 04:33:21 +00:00
|
|
|
// BuildHostnameFile writes the container's hostname file.
|
|
|
|
func (container *Container) BuildHostnameFile() error {
|
|
|
|
return nil
|
|
|
|
}
|
|
|
|
|
2016-03-01 18:23:43 +00:00
|
|
|
// canMountFS determines if the file system for the container
|
|
|
|
// can be mounted locally. In the case of Windows, this is not possible
|
|
|
|
// for Hyper-V containers during WORKDIR execution for example.
|
|
|
|
func (container *Container) canMountFS() bool {
|
|
|
|
return !containertypes.Isolation.IsHyperV(container.HostConfig.Isolation)
|
|
|
|
}
|
2016-09-13 00:17:09 +00:00
|
|
|
|
|
|
|
// EnableServiceDiscoveryOnDefaultNetwork Enable service discovery on default network
|
|
|
|
func (container *Container) EnableServiceDiscoveryOnDefaultNetwork() bool {
|
|
|
|
return true
|
|
|
|
}
|