123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494 |
- package container // import "github.com/docker/docker/api/types/container"
- import (
- "fmt"
- "strings"
- "github.com/docker/docker/api/types/blkiodev"
- "github.com/docker/docker/api/types/mount"
- "github.com/docker/docker/api/types/network"
- "github.com/docker/docker/api/types/strslice"
- "github.com/docker/go-connections/nat"
- units "github.com/docker/go-units"
- )
- // CgroupnsMode represents the cgroup namespace mode of the container
- type CgroupnsMode string
- // cgroup namespace modes for containers
- const (
- CgroupnsModeEmpty CgroupnsMode = ""
- CgroupnsModePrivate CgroupnsMode = "private"
- CgroupnsModeHost CgroupnsMode = "host"
- )
- // IsPrivate indicates whether the container uses its own private cgroup namespace
- func (c CgroupnsMode) IsPrivate() bool {
- return c == CgroupnsModePrivate
- }
- // IsHost indicates whether the container shares the host's cgroup namespace
- func (c CgroupnsMode) IsHost() bool {
- return c == CgroupnsModeHost
- }
- // IsEmpty indicates whether the container cgroup namespace mode is unset
- func (c CgroupnsMode) IsEmpty() bool {
- return c == CgroupnsModeEmpty
- }
- // Valid indicates whether the cgroup namespace mode is valid
- func (c CgroupnsMode) Valid() bool {
- return c.IsEmpty() || c.IsPrivate() || c.IsHost()
- }
- // Isolation represents the isolation technology of a container. The supported
- // values are platform specific
- type Isolation string
- // Isolation modes for containers
- const (
- IsolationEmpty Isolation = "" // IsolationEmpty is unspecified (same behavior as default)
- IsolationDefault Isolation = "default" // IsolationDefault is the default isolation mode on current daemon
- IsolationProcess Isolation = "process" // IsolationProcess is process isolation mode
- IsolationHyperV Isolation = "hyperv" // IsolationHyperV is HyperV isolation mode
- )
- // IsDefault indicates the default isolation technology of a container. On Linux this
- // is the native driver. On Windows, this is a Windows Server Container.
- func (i Isolation) IsDefault() bool {
- // TODO consider making isolation-mode strict (case-sensitive)
- v := Isolation(strings.ToLower(string(i)))
- return v == IsolationDefault || v == IsolationEmpty
- }
- // IsHyperV indicates the use of a Hyper-V partition for isolation
- func (i Isolation) IsHyperV() bool {
- // TODO consider making isolation-mode strict (case-sensitive)
- return Isolation(strings.ToLower(string(i))) == IsolationHyperV
- }
- // IsProcess indicates the use of process isolation
- func (i Isolation) IsProcess() bool {
- // TODO consider making isolation-mode strict (case-sensitive)
- return Isolation(strings.ToLower(string(i))) == IsolationProcess
- }
- // IpcMode represents the container ipc stack.
- type IpcMode string
- // IpcMode constants
- const (
- IPCModeNone IpcMode = "none"
- IPCModeHost IpcMode = "host"
- IPCModeContainer IpcMode = "container"
- IPCModePrivate IpcMode = "private"
- IPCModeShareable IpcMode = "shareable"
- )
- // IsPrivate indicates whether the container uses its own private ipc namespace which can not be shared.
- func (n IpcMode) IsPrivate() bool {
- return n == IPCModePrivate
- }
- // IsHost indicates whether the container shares the host's ipc namespace.
- func (n IpcMode) IsHost() bool {
- return n == IPCModeHost
- }
- // IsShareable indicates whether the container's ipc namespace can be shared with another container.
- func (n IpcMode) IsShareable() bool {
- return n == IPCModeShareable
- }
- // IsContainer indicates whether the container uses another container's ipc namespace.
- func (n IpcMode) IsContainer() bool {
- _, ok := containerID(string(n))
- return ok
- }
- // IsNone indicates whether container IpcMode is set to "none".
- func (n IpcMode) IsNone() bool {
- return n == IPCModeNone
- }
- // IsEmpty indicates whether container IpcMode is empty
- func (n IpcMode) IsEmpty() bool {
- return n == ""
- }
- // Valid indicates whether the ipc mode is valid.
- func (n IpcMode) Valid() bool {
- // TODO(thaJeztah): align with PidMode, and consider container-mode without a container name/ID to be invalid.
- return n.IsEmpty() || n.IsNone() || n.IsPrivate() || n.IsHost() || n.IsShareable() || n.IsContainer()
- }
- // Container returns the name of the container ipc stack is going to be used.
- func (n IpcMode) Container() (idOrName string) {
- idOrName, _ = containerID(string(n))
- return idOrName
- }
- // NetworkMode represents the container network stack.
- type NetworkMode string
- // IsNone indicates whether container isn't using a network stack.
- func (n NetworkMode) IsNone() bool {
- return n == network.NetworkNone
- }
- // IsDefault indicates whether container uses the default network stack.
- func (n NetworkMode) IsDefault() bool {
- return n == network.NetworkDefault
- }
- // IsPrivate indicates whether container uses its private network stack.
- func (n NetworkMode) IsPrivate() bool {
- return !(n.IsHost() || n.IsContainer())
- }
- // IsContainer indicates whether container uses a container network stack.
- func (n NetworkMode) IsContainer() bool {
- _, ok := containerID(string(n))
- return ok
- }
- // ConnectedContainer is the id of the container which network this container is connected to.
- func (n NetworkMode) ConnectedContainer() (idOrName string) {
- idOrName, _ = containerID(string(n))
- return idOrName
- }
- // UserDefined indicates user-created network
- func (n NetworkMode) UserDefined() string {
- if n.IsUserDefined() {
- return string(n)
- }
- return ""
- }
- // UsernsMode represents userns mode in the container.
- type UsernsMode string
- // IsHost indicates whether the container uses the host's userns.
- func (n UsernsMode) IsHost() bool {
- return n == "host"
- }
- // IsPrivate indicates whether the container uses the a private userns.
- func (n UsernsMode) IsPrivate() bool {
- return !n.IsHost()
- }
- // Valid indicates whether the userns is valid.
- func (n UsernsMode) Valid() bool {
- return n == "" || n.IsHost()
- }
- // CgroupSpec represents the cgroup to use for the container.
- type CgroupSpec string
- // IsContainer indicates whether the container is using another container cgroup
- func (c CgroupSpec) IsContainer() bool {
- _, ok := containerID(string(c))
- return ok
- }
- // Valid indicates whether the cgroup spec is valid.
- func (c CgroupSpec) Valid() bool {
- // TODO(thaJeztah): align with PidMode, and consider container-mode without a container name/ID to be invalid.
- return c == "" || c.IsContainer()
- }
- // Container returns the ID or name of the container whose cgroup will be used.
- func (c CgroupSpec) Container() (idOrName string) {
- idOrName, _ = containerID(string(c))
- return idOrName
- }
- // UTSMode represents the UTS namespace of the container.
- type UTSMode string
- // IsPrivate indicates whether the container uses its private UTS namespace.
- func (n UTSMode) IsPrivate() bool {
- return !n.IsHost()
- }
- // IsHost indicates whether the container uses the host's UTS namespace.
- func (n UTSMode) IsHost() bool {
- return n == "host"
- }
- // Valid indicates whether the UTS namespace is valid.
- func (n UTSMode) Valid() bool {
- return n == "" || n.IsHost()
- }
- // PidMode represents the pid namespace of the container.
- type PidMode string
- // IsPrivate indicates whether the container uses its own new pid namespace.
- func (n PidMode) IsPrivate() bool {
- return !(n.IsHost() || n.IsContainer())
- }
- // IsHost indicates whether the container uses the host's pid namespace.
- func (n PidMode) IsHost() bool {
- return n == "host"
- }
- // IsContainer indicates whether the container uses a container's pid namespace.
- func (n PidMode) IsContainer() bool {
- _, ok := containerID(string(n))
- return ok
- }
- // Valid indicates whether the pid namespace is valid.
- func (n PidMode) Valid() bool {
- return n == "" || n.IsHost() || validContainer(string(n))
- }
- // Container returns the name of the container whose pid namespace is going to be used.
- func (n PidMode) Container() (idOrName string) {
- idOrName, _ = containerID(string(n))
- return idOrName
- }
- // DeviceRequest represents a request for devices from a device driver.
- // Used by GPU device drivers.
- type DeviceRequest struct {
- Driver string // Name of device driver
- Count int // Number of devices to request (-1 = All)
- DeviceIDs []string // List of device IDs as recognizable by the device driver
- Capabilities [][]string // An OR list of AND lists of device capabilities (e.g. "gpu")
- Options map[string]string // Options to pass onto the device driver
- }
- // DeviceMapping represents the device mapping between the host and the container.
- type DeviceMapping struct {
- PathOnHost string
- PathInContainer string
- CgroupPermissions string
- }
- // RestartPolicy represents the restart policies of the container.
- type RestartPolicy struct {
- Name RestartPolicyMode
- MaximumRetryCount int
- }
- type RestartPolicyMode string
- const (
- RestartPolicyDisabled RestartPolicyMode = "no"
- RestartPolicyAlways RestartPolicyMode = "always"
- RestartPolicyOnFailure RestartPolicyMode = "on-failure"
- RestartPolicyUnlessStopped RestartPolicyMode = "unless-stopped"
- )
- // IsNone indicates whether the container has the "no" restart policy.
- // This means the container will not automatically restart when exiting.
- func (rp *RestartPolicy) IsNone() bool {
- return rp.Name == RestartPolicyDisabled || rp.Name == ""
- }
- // IsAlways indicates whether the container has the "always" restart policy.
- // This means the container will automatically restart regardless of the exit status.
- func (rp *RestartPolicy) IsAlways() bool {
- return rp.Name == RestartPolicyAlways
- }
- // IsOnFailure indicates whether the container has the "on-failure" restart policy.
- // This means the container will automatically restart of exiting with a non-zero exit status.
- func (rp *RestartPolicy) IsOnFailure() bool {
- return rp.Name == RestartPolicyOnFailure
- }
- // IsUnlessStopped indicates whether the container has the
- // "unless-stopped" restart policy. This means the container will
- // automatically restart unless user has put it to stopped state.
- func (rp *RestartPolicy) IsUnlessStopped() bool {
- return rp.Name == RestartPolicyUnlessStopped
- }
- // IsSame compares two RestartPolicy to see if they are the same
- func (rp *RestartPolicy) IsSame(tp *RestartPolicy) bool {
- return rp.Name == tp.Name && rp.MaximumRetryCount == tp.MaximumRetryCount
- }
- // ValidateRestartPolicy validates the given RestartPolicy.
- func ValidateRestartPolicy(policy RestartPolicy) error {
- switch policy.Name {
- case RestartPolicyAlways, RestartPolicyUnlessStopped, RestartPolicyDisabled:
- if policy.MaximumRetryCount != 0 {
- msg := "invalid restart policy: maximum retry count can only be used with 'on-failure'"
- if policy.MaximumRetryCount < 0 {
- msg += " and cannot be negative"
- }
- return &errInvalidParameter{fmt.Errorf(msg)}
- }
- return nil
- case RestartPolicyOnFailure:
- if policy.MaximumRetryCount < 0 {
- return &errInvalidParameter{fmt.Errorf("invalid restart policy: maximum retry count cannot be negative")}
- }
- return nil
- case "":
- // Versions before v25.0.0 created an empty restart-policy "name" as
- // default. Allow an empty name with "any" MaximumRetryCount for
- // backward-compatibility.
- return nil
- default:
- return &errInvalidParameter{fmt.Errorf("invalid restart policy: unknown policy '%s'; use one of '%s', '%s', '%s', or '%s'", policy.Name, RestartPolicyDisabled, RestartPolicyAlways, RestartPolicyOnFailure, RestartPolicyUnlessStopped)}
- }
- }
- // LogMode is a type to define the available modes for logging
- // These modes affect how logs are handled when log messages start piling up.
- type LogMode string
- // Available logging modes
- const (
- LogModeUnset LogMode = ""
- LogModeBlocking LogMode = "blocking"
- LogModeNonBlock LogMode = "non-blocking"
- )
- // LogConfig represents the logging configuration of the container.
- type LogConfig struct {
- Type string
- Config map[string]string
- }
- // Resources contains container's resources (cgroups config, ulimits...)
- type Resources struct {
- // Applicable to all platforms
- CPUShares int64 `json:"CpuShares"` // CPU shares (relative weight vs. other containers)
- Memory int64 // Memory limit (in bytes)
- NanoCPUs int64 `json:"NanoCpus"` // CPU quota in units of 10<sup>-9</sup> CPUs.
- // Applicable to UNIX platforms
- CgroupParent string // Parent cgroup.
- BlkioWeight uint16 // Block IO weight (relative weight vs. other containers)
- BlkioWeightDevice []*blkiodev.WeightDevice
- BlkioDeviceReadBps []*blkiodev.ThrottleDevice
- BlkioDeviceWriteBps []*blkiodev.ThrottleDevice
- BlkioDeviceReadIOps []*blkiodev.ThrottleDevice
- BlkioDeviceWriteIOps []*blkiodev.ThrottleDevice
- CPUPeriod int64 `json:"CpuPeriod"` // CPU CFS (Completely Fair Scheduler) period
- CPUQuota int64 `json:"CpuQuota"` // CPU CFS (Completely Fair Scheduler) quota
- CPURealtimePeriod int64 `json:"CpuRealtimePeriod"` // CPU real-time period
- CPURealtimeRuntime int64 `json:"CpuRealtimeRuntime"` // CPU real-time runtime
- CpusetCpus string // CpusetCpus 0-2, 0,1
- CpusetMems string // CpusetMems 0-2, 0,1
- Devices []DeviceMapping // List of devices to map inside the container
- DeviceCgroupRules []string // List of rule to be added to the device cgroup
- DeviceRequests []DeviceRequest // List of device requests for device drivers
- // KernelMemory specifies the kernel memory limit (in bytes) for the container.
- // Deprecated: kernel 5.4 deprecated kmem.limit_in_bytes.
- KernelMemory int64 `json:",omitempty"`
- KernelMemoryTCP int64 `json:",omitempty"` // Hard limit for kernel TCP buffer memory (in bytes)
- MemoryReservation int64 // Memory soft limit (in bytes)
- MemorySwap int64 // Total memory usage (memory + swap); set `-1` to enable unlimited swap
- MemorySwappiness *int64 // Tuning container memory swappiness behaviour
- OomKillDisable *bool // Whether to disable OOM Killer or not
- PidsLimit *int64 // Setting PIDs limit for a container; Set `0` or `-1` for unlimited, or `null` to not change.
- Ulimits []*units.Ulimit // List of ulimits to be set in the container
- // Applicable to Windows
- CPUCount int64 `json:"CpuCount"` // CPU count
- CPUPercent int64 `json:"CpuPercent"` // CPU percent
- IOMaximumIOps uint64 // Maximum IOps for the container system drive
- IOMaximumBandwidth uint64 // Maximum IO in bytes per second for the container system drive
- }
- // UpdateConfig holds the mutable attributes of a Container.
- // Those attributes can be updated at runtime.
- type UpdateConfig struct {
- // Contains container's resources (cgroups, ulimits)
- Resources
- RestartPolicy RestartPolicy
- }
- // HostConfig the non-portable Config structure of a container.
- // Here, "non-portable" means "dependent of the host we are running on".
- // Portable information *should* appear in Config.
- type HostConfig struct {
- // Applicable to all platforms
- Binds []string // List of volume bindings for this container
- ContainerIDFile string // File (path) where the containerId is written
- LogConfig LogConfig // Configuration of the logs for this container
- NetworkMode NetworkMode // Network mode to use for the container
- PortBindings nat.PortMap // Port mapping between the exposed port (container) and the host
- RestartPolicy RestartPolicy // Restart policy to be used for the container
- AutoRemove bool // Automatically remove container when it exits
- VolumeDriver string // Name of the volume driver used to mount volumes
- VolumesFrom []string // List of volumes to take from other container
- ConsoleSize [2]uint // Initial console size (height,width)
- Annotations map[string]string `json:",omitempty"` // Arbitrary non-identifying metadata attached to container and provided to the runtime
- // Applicable to UNIX platforms
- CapAdd strslice.StrSlice // List of kernel capabilities to add to the container
- CapDrop strslice.StrSlice // List of kernel capabilities to remove from the container
- CgroupnsMode CgroupnsMode // Cgroup namespace mode to use for the container
- DNS []string `json:"Dns"` // List of DNS server to lookup
- DNSOptions []string `json:"DnsOptions"` // List of DNSOption to look for
- DNSSearch []string `json:"DnsSearch"` // List of DNSSearch to look for
- ExtraHosts []string // List of extra hosts
- GroupAdd []string // List of additional groups that the container process will run as
- IpcMode IpcMode // IPC namespace to use for the container
- Cgroup CgroupSpec // Cgroup to use for the container
- Links []string // List of links (in the name:alias form)
- OomScoreAdj int // Container preference for OOM-killing
- PidMode PidMode // PID namespace to use for the container
- Privileged bool // Is the container in privileged mode
- PublishAllPorts bool // Should docker publish all exposed port for the container
- ReadonlyRootfs bool // Is the container root filesystem in read-only
- SecurityOpt []string // List of string values to customize labels for MLS systems, such as SELinux.
- StorageOpt map[string]string `json:",omitempty"` // Storage driver options per container.
- Tmpfs map[string]string `json:",omitempty"` // List of tmpfs (mounts) used for the container
- UTSMode UTSMode // UTS namespace to use for the container
- UsernsMode UsernsMode // The user namespace to use for the container
- ShmSize int64 // Total shm memory usage
- Sysctls map[string]string `json:",omitempty"` // List of Namespaced sysctls used for the container
- Runtime string `json:",omitempty"` // Runtime to use with this container
- // Applicable to Windows
- Isolation Isolation // Isolation technology of the container (e.g. default, hyperv)
- // Contains container's resources (cgroups, ulimits)
- Resources
- // Mounts specs used by the container
- Mounts []mount.Mount `json:",omitempty"`
- // MaskedPaths is the list of paths to be masked inside the container (this overrides the default set of paths)
- MaskedPaths []string
- // ReadonlyPaths is the list of paths to be set as read-only inside the container (this overrides the default set of paths)
- ReadonlyPaths []string
- // Run a custom init inside the container, if null, use the daemon's configured settings
- Init *bool `json:",omitempty"`
- }
- // containerID splits "container:<ID|name>" values. It returns the container
- // ID or name, and whether an ID/name was found. It returns an empty string and
- // a "false" if the value does not have a "container:" prefix. Further validation
- // of the returned, including checking if the value is empty, should be handled
- // by the caller.
- func containerID(val string) (idOrName string, ok bool) {
- k, v, hasSep := strings.Cut(val, ":")
- if !hasSep || k != "container" {
- return "", false
- }
- return v, true
- }
- // validContainer checks if the given value is a "container:" mode with
- // a non-empty name/ID.
- func validContainer(val string) bool {
- id, ok := containerID(val)
- return ok && id != ""
- }
|