mirror of https://github.com/docker/docs.git
Organize run flags into categories
Flatten the list of `docker run` flags and group them loosely by category (general purpose, security, networking, ...). Signed-off-by: Arnaud Porterie (icecrime) <arnaud.porterie@docker.com> (cherry picked from commit 5b21c8a40823edf82b3b3f22c559c524a49d25a9) Signed-off-by: Tibor Vass <tibor@docker.com>
This commit is contained in:
parent
31d24fa6a9
commit
e3ed7f8c7b
|
@ -55,54 +55,54 @@ type ContainerOptions struct {
|
||||||
flStorageOpt opts.ListOpts
|
flStorageOpt opts.ListOpts
|
||||||
flLabelsFile opts.ListOpts
|
flLabelsFile opts.ListOpts
|
||||||
flLoggingOpts opts.ListOpts
|
flLoggingOpts opts.ListOpts
|
||||||
flPrivileged *bool
|
flPrivileged bool
|
||||||
flPidMode *string
|
flPidMode string
|
||||||
flUTSMode *string
|
flUTSMode string
|
||||||
flUsernsMode *string
|
flUsernsMode string
|
||||||
flPublishAll *bool
|
flPublishAll bool
|
||||||
flStdin *bool
|
flStdin bool
|
||||||
flTty *bool
|
flTty bool
|
||||||
flOomKillDisable *bool
|
flOomKillDisable bool
|
||||||
flOomScoreAdj *int
|
flOomScoreAdj int
|
||||||
flContainerIDFile *string
|
flContainerIDFile string
|
||||||
flEntrypoint *string
|
flEntrypoint string
|
||||||
flHostname *string
|
flHostname string
|
||||||
flMemoryString *string
|
flMemoryString string
|
||||||
flMemoryReservation *string
|
flMemoryReservation string
|
||||||
flMemorySwap *string
|
flMemorySwap string
|
||||||
flKernelMemory *string
|
flKernelMemory string
|
||||||
flUser *string
|
flUser string
|
||||||
flWorkingDir *string
|
flWorkingDir string
|
||||||
flCPUShares *int64
|
flCPUShares int64
|
||||||
flCPUPercent *int64
|
flCPUPercent int64
|
||||||
flCPUPeriod *int64
|
flCPUPeriod int64
|
||||||
flCPUQuota *int64
|
flCPUQuota int64
|
||||||
flCpusetCpus *string
|
flCpusetCpus string
|
||||||
flCpusetMems *string
|
flCpusetMems string
|
||||||
flBlkioWeight *uint16
|
flBlkioWeight uint16
|
||||||
flIOMaxBandwidth *string
|
flIOMaxBandwidth string
|
||||||
flIOMaxIOps *uint64
|
flIOMaxIOps uint64
|
||||||
flSwappiness *int64
|
flSwappiness int64
|
||||||
flNetMode *string
|
flNetMode string
|
||||||
flMacAddress *string
|
flMacAddress string
|
||||||
flIPv4Address *string
|
flIPv4Address string
|
||||||
flIPv6Address *string
|
flIPv6Address string
|
||||||
flIpcMode *string
|
flIpcMode string
|
||||||
flPidsLimit *int64
|
flPidsLimit int64
|
||||||
flRestartPolicy *string
|
flRestartPolicy string
|
||||||
flReadonlyRootfs *bool
|
flReadonlyRootfs bool
|
||||||
flLoggingDriver *string
|
flLoggingDriver string
|
||||||
flCgroupParent *string
|
flCgroupParent string
|
||||||
flVolumeDriver *string
|
flVolumeDriver string
|
||||||
flStopSignal *string
|
flStopSignal string
|
||||||
flIsolation *string
|
flIsolation string
|
||||||
flShmSize *string
|
flShmSize string
|
||||||
flNoHealthcheck *bool
|
flNoHealthcheck bool
|
||||||
flHealthCmd *string
|
flHealthCmd string
|
||||||
flHealthInterval *time.Duration
|
flHealthInterval time.Duration
|
||||||
flHealthTimeout *time.Duration
|
flHealthTimeout time.Duration
|
||||||
flHealthRetries *int
|
flHealthRetries int
|
||||||
flRuntime *string
|
flRuntime string
|
||||||
|
|
||||||
Image string
|
Image string
|
||||||
Args []string
|
Args []string
|
||||||
|
@ -111,122 +111,131 @@ type ContainerOptions struct {
|
||||||
// AddFlags adds all command line flags that will be used by Parse to the FlagSet
|
// AddFlags adds all command line flags that will be used by Parse to the FlagSet
|
||||||
func AddFlags(flags *pflag.FlagSet) *ContainerOptions {
|
func AddFlags(flags *pflag.FlagSet) *ContainerOptions {
|
||||||
copts := &ContainerOptions{
|
copts := &ContainerOptions{
|
||||||
flAttach: opts.NewListOpts(ValidateAttach),
|
|
||||||
flVolumes: opts.NewListOpts(nil),
|
|
||||||
flTmpfs: opts.NewListOpts(nil),
|
|
||||||
flBlkioWeightDevice: NewWeightdeviceOpt(ValidateWeightDevice),
|
|
||||||
flDeviceReadBps: NewThrottledeviceOpt(ValidateThrottleBpsDevice),
|
|
||||||
flDeviceWriteBps: NewThrottledeviceOpt(ValidateThrottleBpsDevice),
|
|
||||||
flLinks: opts.NewListOpts(ValidateLink),
|
|
||||||
flAliases: opts.NewListOpts(nil),
|
flAliases: opts.NewListOpts(nil),
|
||||||
flLinkLocalIPs: opts.NewListOpts(nil),
|
flAttach: opts.NewListOpts(ValidateAttach),
|
||||||
|
flBlkioWeightDevice: NewWeightdeviceOpt(ValidateWeightDevice),
|
||||||
|
flCapAdd: opts.NewListOpts(nil),
|
||||||
|
flCapDrop: opts.NewListOpts(nil),
|
||||||
|
flDNS: opts.NewListOpts(opts.ValidateIPAddress),
|
||||||
|
flDNSOptions: opts.NewListOpts(nil),
|
||||||
|
flDNSSearch: opts.NewListOpts(opts.ValidateDNSSearch),
|
||||||
|
flDeviceReadBps: NewThrottledeviceOpt(ValidateThrottleBpsDevice),
|
||||||
flDeviceReadIOps: NewThrottledeviceOpt(ValidateThrottleIOpsDevice),
|
flDeviceReadIOps: NewThrottledeviceOpt(ValidateThrottleIOpsDevice),
|
||||||
|
flDeviceWriteBps: NewThrottledeviceOpt(ValidateThrottleBpsDevice),
|
||||||
flDeviceWriteIOps: NewThrottledeviceOpt(ValidateThrottleIOpsDevice),
|
flDeviceWriteIOps: NewThrottledeviceOpt(ValidateThrottleIOpsDevice),
|
||||||
flEnv: opts.NewListOpts(ValidateEnv),
|
|
||||||
flLabels: opts.NewListOpts(ValidateEnv),
|
|
||||||
flDevices: opts.NewListOpts(ValidateDevice),
|
flDevices: opts.NewListOpts(ValidateDevice),
|
||||||
|
flEnv: opts.NewListOpts(ValidateEnv),
|
||||||
flUlimits: NewUlimitOpt(nil),
|
flEnvFile: opts.NewListOpts(nil),
|
||||||
flSysctls: opts.NewMapOpts(nil, opts.ValidateSysctl),
|
flExpose: opts.NewListOpts(nil),
|
||||||
|
flExtraHosts: opts.NewListOpts(ValidateExtraHost),
|
||||||
flPublish: opts.NewListOpts(nil),
|
flGroupAdd: opts.NewListOpts(nil),
|
||||||
flExpose: opts.NewListOpts(nil),
|
flLabels: opts.NewListOpts(ValidateEnv),
|
||||||
flDNS: opts.NewListOpts(opts.ValidateIPAddress),
|
flLabelsFile: opts.NewListOpts(nil),
|
||||||
flDNSSearch: opts.NewListOpts(opts.ValidateDNSSearch),
|
flLinkLocalIPs: opts.NewListOpts(nil),
|
||||||
flDNSOptions: opts.NewListOpts(nil),
|
flLinks: opts.NewListOpts(ValidateLink),
|
||||||
flExtraHosts: opts.NewListOpts(ValidateExtraHost),
|
flLoggingOpts: opts.NewListOpts(nil),
|
||||||
flVolumesFrom: opts.NewListOpts(nil),
|
flPublish: opts.NewListOpts(nil),
|
||||||
flEnvFile: opts.NewListOpts(nil),
|
flSecurityOpt: opts.NewListOpts(nil),
|
||||||
flCapAdd: opts.NewListOpts(nil),
|
flStorageOpt: opts.NewListOpts(nil),
|
||||||
flCapDrop: opts.NewListOpts(nil),
|
flSysctls: opts.NewMapOpts(nil, opts.ValidateSysctl),
|
||||||
flGroupAdd: opts.NewListOpts(nil),
|
flTmpfs: opts.NewListOpts(nil),
|
||||||
flSecurityOpt: opts.NewListOpts(nil),
|
flUlimits: NewUlimitOpt(nil),
|
||||||
flStorageOpt: opts.NewListOpts(nil),
|
flVolumes: opts.NewListOpts(nil),
|
||||||
flLabelsFile: opts.NewListOpts(nil),
|
flVolumesFrom: opts.NewListOpts(nil),
|
||||||
flLoggingOpts: opts.NewListOpts(nil),
|
|
||||||
|
|
||||||
flPrivileged: flags.Bool("privileged", false, "Give extended privileges to this container"),
|
|
||||||
flPidMode: flags.String("pid", "", "PID namespace to use"),
|
|
||||||
flUTSMode: flags.String("uts", "", "UTS namespace to use"),
|
|
||||||
flUsernsMode: flags.String("userns", "", "User namespace to use"),
|
|
||||||
flPublishAll: flags.BoolP("publish-all", "P", false, "Publish all exposed ports to random ports"),
|
|
||||||
flStdin: flags.BoolP("interactive", "i", false, "Keep STDIN open even if not attached"),
|
|
||||||
flTty: flags.BoolP("tty", "t", false, "Allocate a pseudo-TTY"),
|
|
||||||
flOomKillDisable: flags.Bool("oom-kill-disable", false, "Disable OOM Killer"),
|
|
||||||
flOomScoreAdj: flags.Int("oom-score-adj", 0, "Tune host's OOM preferences (-1000 to 1000)"),
|
|
||||||
flContainerIDFile: flags.String("cidfile", "", "Write the container ID to the file"),
|
|
||||||
flEntrypoint: flags.String("entrypoint", "", "Overwrite the default ENTRYPOINT of the image"),
|
|
||||||
flHostname: flags.StringP("hostname", "h", "", "Container host name"),
|
|
||||||
flMemoryString: flags.StringP("memory", "m", "", "Memory limit"),
|
|
||||||
flMemoryReservation: flags.String("memory-reservation", "", "Memory soft limit"),
|
|
||||||
flMemorySwap: flags.String("memory-swap", "", "Swap limit equal to memory plus swap: '-1' to enable unlimited swap"),
|
|
||||||
flKernelMemory: flags.String("kernel-memory", "", "Kernel memory limit"),
|
|
||||||
flUser: flags.StringP("user", "u", "", "Username or UID (format: <name|uid>[:<group|gid>])"),
|
|
||||||
flWorkingDir: flags.StringP("workdir", "w", "", "Working directory inside the container"),
|
|
||||||
flCPUShares: flags.Int64P("cpu-shares", "c", 0, "CPU shares (relative weight)"),
|
|
||||||
flCPUPercent: flags.Int64("cpu-percent", 0, "CPU percent (Windows only)"),
|
|
||||||
flCPUPeriod: flags.Int64("cpu-period", 0, "Limit CPU CFS (Completely Fair Scheduler) period"),
|
|
||||||
flCPUQuota: flags.Int64("cpu-quota", 0, "Limit CPU CFS (Completely Fair Scheduler) quota"),
|
|
||||||
flCpusetCpus: flags.String("cpuset-cpus", "", "CPUs in which to allow execution (0-3, 0,1)"),
|
|
||||||
flCpusetMems: flags.String("cpuset-mems", "", "MEMs in which to allow execution (0-3, 0,1)"),
|
|
||||||
flBlkioWeight: flags.Uint16("blkio-weight", 0, "Block IO (relative weight), between 10 and 1000"),
|
|
||||||
flIOMaxBandwidth: flags.String("io-maxbandwidth", "", "Maximum IO bandwidth limit for the system drive (Windows only)"),
|
|
||||||
flIOMaxIOps: flags.Uint64("io-maxiops", 0, "Maximum IOps limit for the system drive (Windows only)"),
|
|
||||||
flSwappiness: flags.Int64("memory-swappiness", -1, "Tune container memory swappiness (0 to 100)"),
|
|
||||||
flNetMode: flags.String("net", "default", "Connect a container to a network"),
|
|
||||||
flMacAddress: flags.String("mac-address", "", "Container MAC address (e.g. 92:d0:c6:0a:29:33)"),
|
|
||||||
flIPv4Address: flags.String("ip", "", "Container IPv4 address (e.g. 172.30.100.104)"),
|
|
||||||
flIPv6Address: flags.String("ip6", "", "Container IPv6 address (e.g. 2001:db8::33)"),
|
|
||||||
flIpcMode: flags.String("ipc", "", "IPC namespace to use"),
|
|
||||||
flPidsLimit: flags.Int64("pids-limit", 0, "Tune container pids limit (set -1 for unlimited)"),
|
|
||||||
flRestartPolicy: flags.String("restart", "no", "Restart policy to apply when a container exits"),
|
|
||||||
flReadonlyRootfs: flags.Bool("read-only", false, "Mount the container's root filesystem as read only"),
|
|
||||||
flLoggingDriver: flags.String("log-driver", "", "Logging driver for container"),
|
|
||||||
flCgroupParent: flags.String("cgroup-parent", "", "Optional parent cgroup for the container"),
|
|
||||||
flVolumeDriver: flags.String("volume-driver", "", "Optional volume driver for the container"),
|
|
||||||
flStopSignal: flags.String("stop-signal", signal.DefaultStopSignal, fmt.Sprintf("Signal to stop a container, %v by default", signal.DefaultStopSignal)),
|
|
||||||
flIsolation: flags.String("isolation", "", "Container isolation technology"),
|
|
||||||
flShmSize: flags.String("shm-size", "", "Size of /dev/shm, default value is 64MB"),
|
|
||||||
flNoHealthcheck: flags.Bool("no-healthcheck", false, "Disable any container-specified HEALTHCHECK"),
|
|
||||||
flHealthCmd: flags.String("health-cmd", "", "Command to run to check health"),
|
|
||||||
flHealthInterval: flags.Duration("health-interval", 0, "Time between running the check"),
|
|
||||||
flHealthTimeout: flags.Duration("health-timeout", 0, "Maximum time to allow one check to run"),
|
|
||||||
flHealthRetries: flags.Int("health-retries", 0, "Consecutive failures needed to report unhealthy"),
|
|
||||||
flRuntime: flags.String("runtime", "", "Runtime to use for this container"),
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// General purpose flags
|
||||||
flags.VarP(&copts.flAttach, "attach", "a", "Attach to STDIN, STDOUT or STDERR")
|
flags.VarP(&copts.flAttach, "attach", "a", "Attach to STDIN, STDOUT or STDERR")
|
||||||
flags.Var(&copts.flBlkioWeightDevice, "blkio-weight-device", "Block IO weight (relative device weight)")
|
|
||||||
flags.Var(&copts.flDeviceReadBps, "device-read-bps", "Limit read rate (bytes per second) from a device")
|
|
||||||
flags.Var(&copts.flDeviceWriteBps, "device-write-bps", "Limit write rate (bytes per second) to a device")
|
|
||||||
flags.Var(&copts.flDeviceReadIOps, "device-read-iops", "Limit read rate (IO per second) from a device")
|
|
||||||
flags.Var(&copts.flDeviceWriteIOps, "device-write-iops", "Limit write rate (IO per second) to a device")
|
|
||||||
flags.VarP(&copts.flVolumes, "volume", "v", "Bind mount a volume")
|
|
||||||
flags.Var(&copts.flTmpfs, "tmpfs", "Mount a tmpfs directory")
|
|
||||||
flags.Var(&copts.flLinks, "link", "Add link to another container")
|
|
||||||
flags.Var(&copts.flAliases, "net-alias", "Add network-scoped alias for the container")
|
|
||||||
flags.Var(&copts.flLinkLocalIPs, "link-local-ip", "Container IPv4/IPv6 link-local addresses")
|
|
||||||
flags.Var(&copts.flDevices, "device", "Add a host device to the container")
|
flags.Var(&copts.flDevices, "device", "Add a host device to the container")
|
||||||
flags.VarP(&copts.flLabels, "label", "l", "Set meta data on a container")
|
|
||||||
flags.Var(&copts.flLabelsFile, "label-file", "Read in a line delimited file of labels")
|
|
||||||
flags.VarP(&copts.flEnv, "env", "e", "Set environment variables")
|
flags.VarP(&copts.flEnv, "env", "e", "Set environment variables")
|
||||||
flags.Var(&copts.flEnvFile, "env-file", "Read in a file of environment variables")
|
flags.Var(&copts.flEnvFile, "env-file", "Read in a file of environment variables")
|
||||||
flags.VarP(&copts.flPublish, "publish", "p", "Publish a container's port(s) to the host")
|
flags.StringVar(&copts.flEntrypoint, "entrypoint", "", "Overwrite the default ENTRYPOINT of the image")
|
||||||
flags.Var(&copts.flExpose, "expose", "Expose a port or a range of ports")
|
flags.Var(&copts.flGroupAdd, "group-add", "Add additional groups to join")
|
||||||
flags.Var(&copts.flDNS, "dns", "Set custom DNS servers")
|
flags.StringVarP(&copts.flHostname, "hostname", "h", "", "Container host name")
|
||||||
flags.Var(&copts.flDNSSearch, "dns-search", "Set custom DNS search domains")
|
flags.BoolVarP(&copts.flStdin, "interactive", "i", false, "Keep STDIN open even if not attached")
|
||||||
flags.Var(&copts.flDNSOptions, "dns-opt", "Set DNS options")
|
flags.VarP(&copts.flLabels, "label", "l", "Set meta data on a container")
|
||||||
flags.Var(&copts.flExtraHosts, "add-host", "Add a custom host-to-IP mapping (host:ip)")
|
flags.Var(&copts.flLabelsFile, "label-file", "Read in a line delimited file of labels")
|
||||||
flags.Var(&copts.flVolumesFrom, "volumes-from", "Mount volumes from the specified container(s)")
|
flags.BoolVar(&copts.flReadonlyRootfs, "read-only", false, "Mount the container's root filesystem as read only")
|
||||||
|
flags.StringVar(&copts.flRestartPolicy, "restart", "no", "Restart policy to apply when a container exits")
|
||||||
|
flags.StringVar(&copts.flStopSignal, "stop-signal", signal.DefaultStopSignal, fmt.Sprintf("Signal to stop a container, %v by default", signal.DefaultStopSignal))
|
||||||
|
flags.Var(copts.flSysctls, "sysctl", "Sysctl options")
|
||||||
|
flags.BoolVarP(&copts.flTty, "tty", "t", false, "Allocate a pseudo-TTY")
|
||||||
|
flags.Var(copts.flUlimits, "ulimit", "Ulimit options")
|
||||||
|
flags.StringVarP(&copts.flUser, "user", "u", "", "Username or UID (format: <name|uid>[:<group|gid>])")
|
||||||
|
flags.StringVarP(&copts.flWorkingDir, "workdir", "w", "", "Working directory inside the container")
|
||||||
|
|
||||||
|
// Security
|
||||||
flags.Var(&copts.flCapAdd, "cap-add", "Add Linux capabilities")
|
flags.Var(&copts.flCapAdd, "cap-add", "Add Linux capabilities")
|
||||||
flags.Var(&copts.flCapDrop, "cap-drop", "Drop Linux capabilities")
|
flags.Var(&copts.flCapDrop, "cap-drop", "Drop Linux capabilities")
|
||||||
flags.Var(&copts.flGroupAdd, "group-add", "Add additional groups to join")
|
flags.BoolVar(&copts.flPrivileged, "privileged", false, "Give extended privileges to this container")
|
||||||
flags.Var(&copts.flSecurityOpt, "security-opt", "Security Options")
|
flags.Var(&copts.flSecurityOpt, "security-opt", "Security Options")
|
||||||
flags.Var(&copts.flStorageOpt, "storage-opt", "Set storage driver options per container")
|
flags.StringVar(&copts.flUsernsMode, "userns", "", "User namespace to use")
|
||||||
flags.Var(copts.flUlimits, "ulimit", "Ulimit options")
|
|
||||||
flags.Var(copts.flSysctls, "sysctl", "Sysctl options")
|
|
||||||
flags.Var(&copts.flLoggingOpts, "log-opt", "Log driver options")
|
|
||||||
|
|
||||||
|
// Network and port publishing flag
|
||||||
|
flags.Var(&copts.flExtraHosts, "add-host", "Add a custom host-to-IP mapping (host:ip)")
|
||||||
|
flags.Var(&copts.flDNS, "dns", "Set custom DNS servers")
|
||||||
|
flags.Var(&copts.flDNSOptions, "dns-opt", "Set DNS options")
|
||||||
|
flags.Var(&copts.flDNSSearch, "dns-search", "Set custom DNS search domains")
|
||||||
|
flags.Var(&copts.flExpose, "expose", "Expose a port or a range of ports")
|
||||||
|
flags.StringVar(&copts.flIPv4Address, "ip", "", "Container IPv4 address (e.g. 172.30.100.104)")
|
||||||
|
flags.StringVar(&copts.flIPv6Address, "ip6", "", "Container IPv6 address (e.g. 2001:db8::33)")
|
||||||
|
flags.Var(&copts.flLinks, "link", "Add link to another container")
|
||||||
|
flags.Var(&copts.flLinkLocalIPs, "link-local-ip", "Container IPv4/IPv6 link-local addresses")
|
||||||
|
flags.StringVar(&copts.flMacAddress, "mac-address", "", "Container MAC address (e.g. 92:d0:c6:0a:29:33)")
|
||||||
|
flags.StringVar(&copts.flNetMode, "net", "default", "Connect a container to a network")
|
||||||
|
flags.Var(&copts.flAliases, "net-alias", "Add network-scoped alias for the container")
|
||||||
|
flags.VarP(&copts.flPublish, "publish", "p", "Publish a container's port(s) to the host")
|
||||||
|
flags.BoolVarP(&copts.flPublishAll, "publish-all", "P", false, "Publish all exposed ports to random ports")
|
||||||
|
|
||||||
|
// Logging and storage
|
||||||
|
flags.StringVar(&copts.flLoggingDriver, "log-driver", "", "Logging driver for container")
|
||||||
|
flags.StringVar(&copts.flVolumeDriver, "volume-driver", "", "Optional volume driver for the container")
|
||||||
|
flags.Var(&copts.flLoggingOpts, "log-opt", "Log driver options")
|
||||||
|
flags.Var(&copts.flStorageOpt, "storage-opt", "Set storage driver options per container")
|
||||||
|
flags.Var(&copts.flTmpfs, "tmpfs", "Mount a tmpfs directory")
|
||||||
|
flags.Var(&copts.flVolumesFrom, "volumes-from", "Mount volumes from the specified container(s)")
|
||||||
|
flags.VarP(&copts.flVolumes, "volume", "v", "Bind mount a volume")
|
||||||
|
|
||||||
|
// Health-checking
|
||||||
|
flags.StringVar(&copts.flHealthCmd, "health-cmd", "", "Command to run to check health")
|
||||||
|
flags.DurationVar(&copts.flHealthInterval, "health-interval", 0, "Time between running the check")
|
||||||
|
flags.IntVar(&copts.flHealthRetries, "health-retries", 0, "Consecutive failures needed to report unhealthy")
|
||||||
|
flags.DurationVar(&copts.flHealthTimeout, "health-timeout", 0, "Maximum time to allow one check to run")
|
||||||
|
flags.BoolVar(&copts.flNoHealthcheck, "no-healthcheck", false, "Disable any container-specified HEALTHCHECK")
|
||||||
|
|
||||||
|
// Resource management
|
||||||
|
flags.Uint16Var(&copts.flBlkioWeight, "blkio-weight", 0, "Block IO (relative weight), between 10 and 1000")
|
||||||
|
flags.Var(&copts.flBlkioWeightDevice, "blkio-weight-device", "Block IO weight (relative device weight)")
|
||||||
|
flags.StringVar(&copts.flContainerIDFile, "cidfile", "", "Write the container ID to the file")
|
||||||
|
flags.StringVar(&copts.flCpusetCpus, "cpuset-cpus", "", "CPUs in which to allow execution (0-3, 0,1)")
|
||||||
|
flags.StringVar(&copts.flCpusetMems, "cpuset-mems", "", "MEMs in which to allow execution (0-3, 0,1)")
|
||||||
|
flags.Int64Var(&copts.flCPUPercent, "cpu-percent", 0, "CPU percent (Windows only)")
|
||||||
|
flags.Int64Var(&copts.flCPUPeriod, "cpu-period", 0, "Limit CPU CFS (Completely Fair Scheduler) period")
|
||||||
|
flags.Int64Var(&copts.flCPUQuota, "cpu-quota", 0, "Limit CPU CFS (Completely Fair Scheduler) quota")
|
||||||
|
flags.Int64VarP(&copts.flCPUShares, "cpu-shares", "c", 0, "CPU shares (relative weight)")
|
||||||
|
flags.Var(&copts.flDeviceReadBps, "device-read-bps", "Limit read rate (bytes per second) from a device")
|
||||||
|
flags.Var(&copts.flDeviceReadIOps, "device-read-iops", "Limit read rate (IO per second) from a device")
|
||||||
|
flags.Var(&copts.flDeviceWriteBps, "device-write-bps", "Limit write rate (bytes per second) to a device")
|
||||||
|
flags.Var(&copts.flDeviceWriteIOps, "device-write-iops", "Limit write rate (IO per second) to a device")
|
||||||
|
flags.StringVar(&copts.flIOMaxBandwidth, "io-maxbandwidth", "", "Maximum IO bandwidth limit for the system drive (Windows only)")
|
||||||
|
flags.Uint64Var(&copts.flIOMaxIOps, "io-maxiops", 0, "Maximum IOps limit for the system drive (Windows only)")
|
||||||
|
flags.StringVar(&copts.flKernelMemory, "kernel-memory", "", "Kernel memory limit")
|
||||||
|
flags.StringVarP(&copts.flMemoryString, "memory", "m", "", "Memory limit")
|
||||||
|
flags.StringVar(&copts.flMemoryReservation, "memory-reservation", "", "Memory soft limit")
|
||||||
|
flags.StringVar(&copts.flMemorySwap, "memory-swap", "", "Swap limit equal to memory plus swap: '-1' to enable unlimited swap")
|
||||||
|
flags.Int64Var(&copts.flSwappiness, "memory-swappiness", -1, "Tune container memory swappiness (0 to 100)")
|
||||||
|
flags.BoolVar(&copts.flOomKillDisable, "oom-kill-disable", false, "Disable OOM Killer")
|
||||||
|
flags.IntVar(&copts.flOomScoreAdj, "oom-score-adj", 0, "Tune host's OOM preferences (-1000 to 1000)")
|
||||||
|
flags.Int64Var(&copts.flPidsLimit, "pids-limit", 0, "Tune container pids limit (set -1 for unlimited)")
|
||||||
|
|
||||||
|
// Low-level execution (cgroups, namespaces, ...)
|
||||||
|
flags.StringVar(&copts.flCgroupParent, "cgroup-parent", "", "Optional parent cgroup for the container")
|
||||||
|
flags.StringVar(&copts.flIpcMode, "ipc", "", "IPC namespace to use")
|
||||||
|
flags.StringVar(&copts.flIsolation, "isolation", "", "Container isolation technology")
|
||||||
|
flags.StringVar(&copts.flPidMode, "pid", "", "PID namespace to use")
|
||||||
|
flags.StringVar(&copts.flShmSize, "shm-size", "", "Size of /dev/shm, default value is 64MB")
|
||||||
|
flags.StringVar(&copts.flUTSMode, "uts", "", "UTS namespace to use")
|
||||||
|
flags.StringVar(&copts.flRuntime, "runtime", "", "Runtime to use for this container")
|
||||||
return copts
|
return copts
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -241,12 +250,12 @@ func Parse(flags *pflag.FlagSet, copts *ContainerOptions) (*container.Config, *c
|
||||||
)
|
)
|
||||||
|
|
||||||
// Validate the input mac address
|
// Validate the input mac address
|
||||||
if *copts.flMacAddress != "" {
|
if copts.flMacAddress != "" {
|
||||||
if _, err := ValidateMACAddress(*copts.flMacAddress); err != nil {
|
if _, err := ValidateMACAddress(copts.flMacAddress); err != nil {
|
||||||
return nil, nil, nil, fmt.Errorf("%s is not a valid mac address", *copts.flMacAddress)
|
return nil, nil, nil, fmt.Errorf("%s is not a valid mac address", copts.flMacAddress)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
if *copts.flStdin {
|
if copts.flStdin {
|
||||||
attachStdin = true
|
attachStdin = true
|
||||||
}
|
}
|
||||||
// If -a is not set, attach to stdout and stderr
|
// If -a is not set, attach to stdout and stderr
|
||||||
|
@ -258,27 +267,27 @@ func Parse(flags *pflag.FlagSet, copts *ContainerOptions) (*container.Config, *c
|
||||||
var err error
|
var err error
|
||||||
|
|
||||||
var flMemory int64
|
var flMemory int64
|
||||||
if *copts.flMemoryString != "" {
|
if copts.flMemoryString != "" {
|
||||||
flMemory, err = units.RAMInBytes(*copts.flMemoryString)
|
flMemory, err = units.RAMInBytes(copts.flMemoryString)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return nil, nil, nil, err
|
return nil, nil, nil, err
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
var MemoryReservation int64
|
var MemoryReservation int64
|
||||||
if *copts.flMemoryReservation != "" {
|
if copts.flMemoryReservation != "" {
|
||||||
MemoryReservation, err = units.RAMInBytes(*copts.flMemoryReservation)
|
MemoryReservation, err = units.RAMInBytes(copts.flMemoryReservation)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return nil, nil, nil, err
|
return nil, nil, nil, err
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
var memorySwap int64
|
var memorySwap int64
|
||||||
if *copts.flMemorySwap != "" {
|
if copts.flMemorySwap != "" {
|
||||||
if *copts.flMemorySwap == "-1" {
|
if copts.flMemorySwap == "-1" {
|
||||||
memorySwap = -1
|
memorySwap = -1
|
||||||
} else {
|
} else {
|
||||||
memorySwap, err = units.RAMInBytes(*copts.flMemorySwap)
|
memorySwap, err = units.RAMInBytes(copts.flMemorySwap)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return nil, nil, nil, err
|
return nil, nil, nil, err
|
||||||
}
|
}
|
||||||
|
@ -286,21 +295,21 @@ func Parse(flags *pflag.FlagSet, copts *ContainerOptions) (*container.Config, *c
|
||||||
}
|
}
|
||||||
|
|
||||||
var KernelMemory int64
|
var KernelMemory int64
|
||||||
if *copts.flKernelMemory != "" {
|
if copts.flKernelMemory != "" {
|
||||||
KernelMemory, err = units.RAMInBytes(*copts.flKernelMemory)
|
KernelMemory, err = units.RAMInBytes(copts.flKernelMemory)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return nil, nil, nil, err
|
return nil, nil, nil, err
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
swappiness := *copts.flSwappiness
|
swappiness := copts.flSwappiness
|
||||||
if swappiness != -1 && (swappiness < 0 || swappiness > 100) {
|
if swappiness != -1 && (swappiness < 0 || swappiness > 100) {
|
||||||
return nil, nil, nil, fmt.Errorf("invalid value: %d. Valid memory swappiness range is 0-100", swappiness)
|
return nil, nil, nil, fmt.Errorf("invalid value: %d. Valid memory swappiness range is 0-100", swappiness)
|
||||||
}
|
}
|
||||||
|
|
||||||
var shmSize int64
|
var shmSize int64
|
||||||
if *copts.flShmSize != "" {
|
if copts.flShmSize != "" {
|
||||||
shmSize, err = units.RAMInBytes(*copts.flShmSize)
|
shmSize, err = units.RAMInBytes(copts.flShmSize)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return nil, nil, nil, err
|
return nil, nil, nil, err
|
||||||
}
|
}
|
||||||
|
@ -308,13 +317,13 @@ func Parse(flags *pflag.FlagSet, copts *ContainerOptions) (*container.Config, *c
|
||||||
|
|
||||||
// TODO FIXME units.RAMInBytes should have a uint64 version
|
// TODO FIXME units.RAMInBytes should have a uint64 version
|
||||||
var maxIOBandwidth int64
|
var maxIOBandwidth int64
|
||||||
if *copts.flIOMaxBandwidth != "" {
|
if copts.flIOMaxBandwidth != "" {
|
||||||
maxIOBandwidth, err = units.RAMInBytes(*copts.flIOMaxBandwidth)
|
maxIOBandwidth, err = units.RAMInBytes(copts.flIOMaxBandwidth)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return nil, nil, nil, err
|
return nil, nil, nil, err
|
||||||
}
|
}
|
||||||
if maxIOBandwidth < 0 {
|
if maxIOBandwidth < 0 {
|
||||||
return nil, nil, nil, fmt.Errorf("invalid value: %s. Maximum IO Bandwidth must be positive", *copts.flIOMaxBandwidth)
|
return nil, nil, nil, fmt.Errorf("invalid value: %s. Maximum IO Bandwidth must be positive", copts.flIOMaxBandwidth)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -349,8 +358,8 @@ func Parse(flags *pflag.FlagSet, copts *ContainerOptions) (*container.Config, *c
|
||||||
if len(copts.Args) > 0 {
|
if len(copts.Args) > 0 {
|
||||||
runCmd = strslice.StrSlice(copts.Args)
|
runCmd = strslice.StrSlice(copts.Args)
|
||||||
}
|
}
|
||||||
if *copts.flEntrypoint != "" {
|
if copts.flEntrypoint != "" {
|
||||||
entrypoint = strslice.StrSlice{*copts.flEntrypoint}
|
entrypoint = strslice.StrSlice{copts.flEntrypoint}
|
||||||
}
|
}
|
||||||
|
|
||||||
ports, portBindings, err := nat.ParsePortSpecs(copts.flPublish.GetAll())
|
ports, portBindings, err := nat.ParsePortSpecs(copts.flPublish.GetAll())
|
||||||
|
@ -404,32 +413,32 @@ func Parse(flags *pflag.FlagSet, copts *ContainerOptions) (*container.Config, *c
|
||||||
return nil, nil, nil, err
|
return nil, nil, nil, err
|
||||||
}
|
}
|
||||||
|
|
||||||
ipcMode := container.IpcMode(*copts.flIpcMode)
|
ipcMode := container.IpcMode(copts.flIpcMode)
|
||||||
if !ipcMode.Valid() {
|
if !ipcMode.Valid() {
|
||||||
return nil, nil, nil, fmt.Errorf("--ipc: invalid IPC mode")
|
return nil, nil, nil, fmt.Errorf("--ipc: invalid IPC mode")
|
||||||
}
|
}
|
||||||
|
|
||||||
pidMode := container.PidMode(*copts.flPidMode)
|
pidMode := container.PidMode(copts.flPidMode)
|
||||||
if !pidMode.Valid() {
|
if !pidMode.Valid() {
|
||||||
return nil, nil, nil, fmt.Errorf("--pid: invalid PID mode")
|
return nil, nil, nil, fmt.Errorf("--pid: invalid PID mode")
|
||||||
}
|
}
|
||||||
|
|
||||||
utsMode := container.UTSMode(*copts.flUTSMode)
|
utsMode := container.UTSMode(copts.flUTSMode)
|
||||||
if !utsMode.Valid() {
|
if !utsMode.Valid() {
|
||||||
return nil, nil, nil, fmt.Errorf("--uts: invalid UTS mode")
|
return nil, nil, nil, fmt.Errorf("--uts: invalid UTS mode")
|
||||||
}
|
}
|
||||||
|
|
||||||
usernsMode := container.UsernsMode(*copts.flUsernsMode)
|
usernsMode := container.UsernsMode(copts.flUsernsMode)
|
||||||
if !usernsMode.Valid() {
|
if !usernsMode.Valid() {
|
||||||
return nil, nil, nil, fmt.Errorf("--userns: invalid USER mode")
|
return nil, nil, nil, fmt.Errorf("--userns: invalid USER mode")
|
||||||
}
|
}
|
||||||
|
|
||||||
restartPolicy, err := ParseRestartPolicy(*copts.flRestartPolicy)
|
restartPolicy, err := ParseRestartPolicy(copts.flRestartPolicy)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return nil, nil, nil, err
|
return nil, nil, nil, err
|
||||||
}
|
}
|
||||||
|
|
||||||
loggingOpts, err := parseLoggingOpts(*copts.flLoggingDriver, copts.flLoggingOpts.GetAll())
|
loggingOpts, err := parseLoggingOpts(copts.flLoggingDriver, copts.flLoggingOpts.GetAll())
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return nil, nil, nil, err
|
return nil, nil, nil, err
|
||||||
}
|
}
|
||||||
|
@ -446,11 +455,11 @@ func Parse(flags *pflag.FlagSet, copts *ContainerOptions) (*container.Config, *c
|
||||||
|
|
||||||
// Healthcheck
|
// Healthcheck
|
||||||
var healthConfig *container.HealthConfig
|
var healthConfig *container.HealthConfig
|
||||||
haveHealthSettings := *copts.flHealthCmd != "" ||
|
haveHealthSettings := copts.flHealthCmd != "" ||
|
||||||
*copts.flHealthInterval != 0 ||
|
copts.flHealthInterval != 0 ||
|
||||||
*copts.flHealthTimeout != 0 ||
|
copts.flHealthTimeout != 0 ||
|
||||||
*copts.flHealthRetries != 0
|
copts.flHealthRetries != 0
|
||||||
if *copts.flNoHealthcheck {
|
if copts.flNoHealthcheck {
|
||||||
if haveHealthSettings {
|
if haveHealthSettings {
|
||||||
return nil, nil, nil, fmt.Errorf("--no-healthcheck conflicts with --health-* options")
|
return nil, nil, nil, fmt.Errorf("--no-healthcheck conflicts with --health-* options")
|
||||||
}
|
}
|
||||||
|
@ -458,62 +467,62 @@ func Parse(flags *pflag.FlagSet, copts *ContainerOptions) (*container.Config, *c
|
||||||
healthConfig = &container.HealthConfig{Test: test}
|
healthConfig = &container.HealthConfig{Test: test}
|
||||||
} else if haveHealthSettings {
|
} else if haveHealthSettings {
|
||||||
var probe strslice.StrSlice
|
var probe strslice.StrSlice
|
||||||
if *copts.flHealthCmd != "" {
|
if copts.flHealthCmd != "" {
|
||||||
args := []string{"CMD-SHELL", *copts.flHealthCmd}
|
args := []string{"CMD-SHELL", copts.flHealthCmd}
|
||||||
probe = strslice.StrSlice(args)
|
probe = strslice.StrSlice(args)
|
||||||
}
|
}
|
||||||
if *copts.flHealthInterval < 0 {
|
if copts.flHealthInterval < 0 {
|
||||||
return nil, nil, nil, fmt.Errorf("--health-interval cannot be negative")
|
return nil, nil, nil, fmt.Errorf("--health-interval cannot be negative")
|
||||||
}
|
}
|
||||||
if *copts.flHealthTimeout < 0 {
|
if copts.flHealthTimeout < 0 {
|
||||||
return nil, nil, nil, fmt.Errorf("--health-timeout cannot be negative")
|
return nil, nil, nil, fmt.Errorf("--health-timeout cannot be negative")
|
||||||
}
|
}
|
||||||
|
|
||||||
healthConfig = &container.HealthConfig{
|
healthConfig = &container.HealthConfig{
|
||||||
Test: probe,
|
Test: probe,
|
||||||
Interval: *copts.flHealthInterval,
|
Interval: copts.flHealthInterval,
|
||||||
Timeout: *copts.flHealthTimeout,
|
Timeout: copts.flHealthTimeout,
|
||||||
Retries: *copts.flHealthRetries,
|
Retries: copts.flHealthRetries,
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
resources := container.Resources{
|
resources := container.Resources{
|
||||||
CgroupParent: *copts.flCgroupParent,
|
CgroupParent: copts.flCgroupParent,
|
||||||
Memory: flMemory,
|
Memory: flMemory,
|
||||||
MemoryReservation: MemoryReservation,
|
MemoryReservation: MemoryReservation,
|
||||||
MemorySwap: memorySwap,
|
MemorySwap: memorySwap,
|
||||||
MemorySwappiness: copts.flSwappiness,
|
MemorySwappiness: &copts.flSwappiness,
|
||||||
KernelMemory: KernelMemory,
|
KernelMemory: KernelMemory,
|
||||||
OomKillDisable: copts.flOomKillDisable,
|
OomKillDisable: &copts.flOomKillDisable,
|
||||||
CPUPercent: *copts.flCPUPercent,
|
CPUPercent: copts.flCPUPercent,
|
||||||
CPUShares: *copts.flCPUShares,
|
CPUShares: copts.flCPUShares,
|
||||||
CPUPeriod: *copts.flCPUPeriod,
|
CPUPeriod: copts.flCPUPeriod,
|
||||||
CpusetCpus: *copts.flCpusetCpus,
|
CpusetCpus: copts.flCpusetCpus,
|
||||||
CpusetMems: *copts.flCpusetMems,
|
CpusetMems: copts.flCpusetMems,
|
||||||
CPUQuota: *copts.flCPUQuota,
|
CPUQuota: copts.flCPUQuota,
|
||||||
PidsLimit: *copts.flPidsLimit,
|
PidsLimit: copts.flPidsLimit,
|
||||||
BlkioWeight: *copts.flBlkioWeight,
|
BlkioWeight: copts.flBlkioWeight,
|
||||||
BlkioWeightDevice: copts.flBlkioWeightDevice.GetList(),
|
BlkioWeightDevice: copts.flBlkioWeightDevice.GetList(),
|
||||||
BlkioDeviceReadBps: copts.flDeviceReadBps.GetList(),
|
BlkioDeviceReadBps: copts.flDeviceReadBps.GetList(),
|
||||||
BlkioDeviceWriteBps: copts.flDeviceWriteBps.GetList(),
|
BlkioDeviceWriteBps: copts.flDeviceWriteBps.GetList(),
|
||||||
BlkioDeviceReadIOps: copts.flDeviceReadIOps.GetList(),
|
BlkioDeviceReadIOps: copts.flDeviceReadIOps.GetList(),
|
||||||
BlkioDeviceWriteIOps: copts.flDeviceWriteIOps.GetList(),
|
BlkioDeviceWriteIOps: copts.flDeviceWriteIOps.GetList(),
|
||||||
IOMaximumIOps: *copts.flIOMaxIOps,
|
IOMaximumIOps: copts.flIOMaxIOps,
|
||||||
IOMaximumBandwidth: uint64(maxIOBandwidth),
|
IOMaximumBandwidth: uint64(maxIOBandwidth),
|
||||||
Ulimits: copts.flUlimits.GetList(),
|
Ulimits: copts.flUlimits.GetList(),
|
||||||
Devices: deviceMappings,
|
Devices: deviceMappings,
|
||||||
}
|
}
|
||||||
|
|
||||||
config := &container.Config{
|
config := &container.Config{
|
||||||
Hostname: *copts.flHostname,
|
Hostname: copts.flHostname,
|
||||||
ExposedPorts: ports,
|
ExposedPorts: ports,
|
||||||
User: *copts.flUser,
|
User: copts.flUser,
|
||||||
Tty: *copts.flTty,
|
Tty: copts.flTty,
|
||||||
// TODO: deprecated, it comes from -n, --networking
|
// TODO: deprecated, it comes from -n, --networking
|
||||||
// it's still needed internally to set the network to disabled
|
// it's still needed internally to set the network to disabled
|
||||||
// if e.g. bridge is none in daemon opts, and in inspect
|
// if e.g. bridge is none in daemon opts, and in inspect
|
||||||
NetworkDisabled: false,
|
NetworkDisabled: false,
|
||||||
OpenStdin: *copts.flStdin,
|
OpenStdin: copts.flStdin,
|
||||||
AttachStdin: attachStdin,
|
AttachStdin: attachStdin,
|
||||||
AttachStdout: attachStdout,
|
AttachStdout: attachStdout,
|
||||||
AttachStderr: attachStderr,
|
AttachStderr: attachStderr,
|
||||||
|
@ -521,24 +530,24 @@ func Parse(flags *pflag.FlagSet, copts *ContainerOptions) (*container.Config, *c
|
||||||
Cmd: runCmd,
|
Cmd: runCmd,
|
||||||
Image: copts.Image,
|
Image: copts.Image,
|
||||||
Volumes: copts.flVolumes.GetMap(),
|
Volumes: copts.flVolumes.GetMap(),
|
||||||
MacAddress: *copts.flMacAddress,
|
MacAddress: copts.flMacAddress,
|
||||||
Entrypoint: entrypoint,
|
Entrypoint: entrypoint,
|
||||||
WorkingDir: *copts.flWorkingDir,
|
WorkingDir: copts.flWorkingDir,
|
||||||
Labels: ConvertKVStringsToMap(labels),
|
Labels: ConvertKVStringsToMap(labels),
|
||||||
Healthcheck: healthConfig,
|
Healthcheck: healthConfig,
|
||||||
}
|
}
|
||||||
if flags.Changed("stop-signal") {
|
if flags.Changed("stop-signal") {
|
||||||
config.StopSignal = *copts.flStopSignal
|
config.StopSignal = copts.flStopSignal
|
||||||
}
|
}
|
||||||
|
|
||||||
hostConfig := &container.HostConfig{
|
hostConfig := &container.HostConfig{
|
||||||
Binds: binds,
|
Binds: binds,
|
||||||
ContainerIDFile: *copts.flContainerIDFile,
|
ContainerIDFile: copts.flContainerIDFile,
|
||||||
OomScoreAdj: *copts.flOomScoreAdj,
|
OomScoreAdj: copts.flOomScoreAdj,
|
||||||
Privileged: *copts.flPrivileged,
|
Privileged: copts.flPrivileged,
|
||||||
PortBindings: portBindings,
|
PortBindings: portBindings,
|
||||||
Links: copts.flLinks.GetAll(),
|
Links: copts.flLinks.GetAll(),
|
||||||
PublishAllPorts: *copts.flPublishAll,
|
PublishAllPorts: copts.flPublishAll,
|
||||||
// Make sure the dns fields are never nil.
|
// Make sure the dns fields are never nil.
|
||||||
// New containers don't ever have those fields nil,
|
// New containers don't ever have those fields nil,
|
||||||
// but pre created containers can still have those nil values.
|
// but pre created containers can still have those nil values.
|
||||||
|
@ -549,7 +558,7 @@ func Parse(flags *pflag.FlagSet, copts *ContainerOptions) (*container.Config, *c
|
||||||
DNSOptions: copts.flDNSOptions.GetAllOrEmpty(),
|
DNSOptions: copts.flDNSOptions.GetAllOrEmpty(),
|
||||||
ExtraHosts: copts.flExtraHosts.GetAll(),
|
ExtraHosts: copts.flExtraHosts.GetAll(),
|
||||||
VolumesFrom: copts.flVolumesFrom.GetAll(),
|
VolumesFrom: copts.flVolumesFrom.GetAll(),
|
||||||
NetworkMode: container.NetworkMode(*copts.flNetMode),
|
NetworkMode: container.NetworkMode(copts.flNetMode),
|
||||||
IpcMode: ipcMode,
|
IpcMode: ipcMode,
|
||||||
PidMode: pidMode,
|
PidMode: pidMode,
|
||||||
UTSMode: utsMode,
|
UTSMode: utsMode,
|
||||||
|
@ -560,15 +569,15 @@ func Parse(flags *pflag.FlagSet, copts *ContainerOptions) (*container.Config, *c
|
||||||
RestartPolicy: restartPolicy,
|
RestartPolicy: restartPolicy,
|
||||||
SecurityOpt: securityOpts,
|
SecurityOpt: securityOpts,
|
||||||
StorageOpt: storageOpts,
|
StorageOpt: storageOpts,
|
||||||
ReadonlyRootfs: *copts.flReadonlyRootfs,
|
ReadonlyRootfs: copts.flReadonlyRootfs,
|
||||||
LogConfig: container.LogConfig{Type: *copts.flLoggingDriver, Config: loggingOpts},
|
LogConfig: container.LogConfig{Type: copts.flLoggingDriver, Config: loggingOpts},
|
||||||
VolumeDriver: *copts.flVolumeDriver,
|
VolumeDriver: copts.flVolumeDriver,
|
||||||
Isolation: container.Isolation(*copts.flIsolation),
|
Isolation: container.Isolation(copts.flIsolation),
|
||||||
ShmSize: shmSize,
|
ShmSize: shmSize,
|
||||||
Resources: resources,
|
Resources: resources,
|
||||||
Tmpfs: tmpfs,
|
Tmpfs: tmpfs,
|
||||||
Sysctls: copts.flSysctls.GetAll(),
|
Sysctls: copts.flSysctls.GetAll(),
|
||||||
Runtime: *copts.flRuntime,
|
Runtime: copts.flRuntime,
|
||||||
}
|
}
|
||||||
|
|
||||||
// When allocating stdin in attached mode, close stdin at client disconnect
|
// When allocating stdin in attached mode, close stdin at client disconnect
|
||||||
|
@ -580,13 +589,13 @@ func Parse(flags *pflag.FlagSet, copts *ContainerOptions) (*container.Config, *c
|
||||||
EndpointsConfig: make(map[string]*networktypes.EndpointSettings),
|
EndpointsConfig: make(map[string]*networktypes.EndpointSettings),
|
||||||
}
|
}
|
||||||
|
|
||||||
if *copts.flIPv4Address != "" || *copts.flIPv6Address != "" || copts.flLinkLocalIPs.Len() > 0 {
|
if copts.flIPv4Address != "" || copts.flIPv6Address != "" || copts.flLinkLocalIPs.Len() > 0 {
|
||||||
epConfig := &networktypes.EndpointSettings{}
|
epConfig := &networktypes.EndpointSettings{}
|
||||||
networkingConfig.EndpointsConfig[string(hostConfig.NetworkMode)] = epConfig
|
networkingConfig.EndpointsConfig[string(hostConfig.NetworkMode)] = epConfig
|
||||||
|
|
||||||
epConfig.IPAMConfig = &networktypes.EndpointIPAMConfig{
|
epConfig.IPAMConfig = &networktypes.EndpointIPAMConfig{
|
||||||
IPv4Address: *copts.flIPv4Address,
|
IPv4Address: copts.flIPv4Address,
|
||||||
IPv6Address: *copts.flIPv6Address,
|
IPv6Address: copts.flIPv6Address,
|
||||||
}
|
}
|
||||||
|
|
||||||
if copts.flLinkLocalIPs.Len() > 0 {
|
if copts.flLinkLocalIPs.Len() > 0 {
|
||||||
|
|
Loading…
Reference in New Issue