Signed-off-by: John Howard <jhoward@microsoft.com>
| ... | ... |
@@ -65,22 +65,17 @@ func populateCommand(c *Container, env []string) error {
|
| 65 | 65 |
Interface: nil, |
| 66 | 66 |
} |
| 67 | 67 |
|
| 68 |
- // TODO Windows. Appropriate network mode (will refactor as part of |
|
| 69 |
- // libnetwork. For now, even through bridge not used, let it succeed to |
|
| 70 |
- // allow the Windows daemon to limp during its bring-up |
|
| 71 | 68 |
parts := strings.SplitN(string(c.hostConfig.NetworkMode), ":", 2) |
| 72 | 69 |
switch parts[0] {
|
| 70 |
+ |
|
| 73 | 71 |
case "none": |
| 74 |
- case "bridge", "": // empty string to support existing containers |
|
| 72 |
+ case "default", "": // empty string to support existing containers |
|
| 75 | 73 |
if !c.Config.NetworkDisabled {
|
| 76 | 74 |
network := c.NetworkSettings |
| 77 | 75 |
en.Interface = &execdriver.NetworkInterface{
|
| 78 |
- Bridge: network.Bridge, |
|
| 79 | 76 |
MacAddress: network.MacAddress, |
| 80 | 77 |
} |
| 81 | 78 |
} |
| 82 |
- case "host", "container": |
|
| 83 |
- return fmt.Errorf("unsupported network mode: %s", c.hostConfig.NetworkMode)
|
|
| 84 | 79 |
default: |
| 85 | 80 |
return fmt.Errorf("invalid network mode: %s", c.hostConfig.NetworkMode)
|
| 86 | 81 |
} |
| ... | ... |
@@ -29,7 +29,6 @@ import ( |
| 29 | 29 |
"github.com/docker/docker/pkg/graphdb" |
| 30 | 30 |
"github.com/docker/docker/pkg/ioutils" |
| 31 | 31 |
"github.com/docker/docker/pkg/namesgenerator" |
| 32 |
- "github.com/docker/docker/pkg/parsers" |
|
| 33 | 32 |
"github.com/docker/docker/pkg/stringid" |
| 34 | 33 |
"github.com/docker/docker/pkg/sysinfo" |
| 35 | 34 |
"github.com/docker/docker/pkg/system" |
| ... | ... |
@@ -553,43 +552,6 @@ func (daemon *Daemon) RegisterLink(parent, child *Container, alias string) error |
| 553 | 553 |
return nil |
| 554 | 554 |
} |
| 555 | 555 |
|
| 556 |
-func (daemon *Daemon) RegisterLinks(container *Container, hostConfig *runconfig.HostConfig) error {
|
|
| 557 |
- if hostConfig != nil && hostConfig.Links != nil {
|
|
| 558 |
- for _, l := range hostConfig.Links {
|
|
| 559 |
- name, alias, err := parsers.ParseLink(l) |
|
| 560 |
- if err != nil {
|
|
| 561 |
- return err |
|
| 562 |
- } |
|
| 563 |
- child, err := daemon.Get(name) |
|
| 564 |
- if err != nil {
|
|
| 565 |
- //An error from daemon.Get() means this name could not be found |
|
| 566 |
- return fmt.Errorf("Could not get container for %s", name)
|
|
| 567 |
- } |
|
| 568 |
- for child.hostConfig.NetworkMode.IsContainer() {
|
|
| 569 |
- parts := strings.SplitN(string(child.hostConfig.NetworkMode), ":", 2) |
|
| 570 |
- child, err = daemon.Get(parts[1]) |
|
| 571 |
- if err != nil {
|
|
| 572 |
- return fmt.Errorf("Could not get container for %s", parts[1])
|
|
| 573 |
- } |
|
| 574 |
- } |
|
| 575 |
- if child.hostConfig.NetworkMode.IsHost() {
|
|
| 576 |
- return runconfig.ErrConflictHostNetworkAndLinks |
|
| 577 |
- } |
|
| 578 |
- if err := daemon.RegisterLink(container, child, alias); err != nil {
|
|
| 579 |
- return err |
|
| 580 |
- } |
|
| 581 |
- } |
|
| 582 |
- |
|
| 583 |
- // After we load all the links into the daemon |
|
| 584 |
- // set them to nil on the hostconfig |
|
| 585 |
- hostConfig.Links = nil |
|
| 586 |
- if err := container.WriteHostConfig(); err != nil {
|
|
| 587 |
- return err |
|
| 588 |
- } |
|
| 589 |
- } |
|
| 590 |
- return nil |
|
| 591 |
-} |
|
| 592 |
- |
|
| 593 | 556 |
func NewDaemon(config *Config, registryService *registry.Service) (daemon *Daemon, err error) {
|
| 594 | 557 |
setDefaultMtu(config) |
| 595 | 558 |
|
| ... | ... |
@@ -17,6 +17,7 @@ import ( |
| 17 | 17 |
"github.com/docker/docker/daemon/graphdriver" |
| 18 | 18 |
"github.com/docker/docker/pkg/archive" |
| 19 | 19 |
"github.com/docker/docker/pkg/fileutils" |
| 20 |
+ "github.com/docker/docker/pkg/parsers" |
|
| 20 | 21 |
"github.com/docker/docker/pkg/parsers/kernel" |
| 21 | 22 |
"github.com/docker/docker/pkg/system" |
| 22 | 23 |
"github.com/docker/docker/runconfig" |
| ... | ... |
@@ -460,3 +461,44 @@ func setupInitLayer(initLayer string) error {
|
| 460 | 460 |
func (daemon *Daemon) NetworkApiRouter() func(w http.ResponseWriter, req *http.Request) {
|
| 461 | 461 |
return nwapi.NewHTTPHandler(daemon.netController) |
| 462 | 462 |
} |
| 463 |
+ |
|
| 464 |
+func (daemon *Daemon) RegisterLinks(container *Container, hostConfig *runconfig.HostConfig) error {
|
|
| 465 |
+ |
|
| 466 |
+ if hostConfig == nil || hostConfig.Links == nil {
|
|
| 467 |
+ return nil |
|
| 468 |
+ } |
|
| 469 |
+ |
|
| 470 |
+ for _, l := range hostConfig.Links {
|
|
| 471 |
+ name, alias, err := parsers.ParseLink(l) |
|
| 472 |
+ if err != nil {
|
|
| 473 |
+ return err |
|
| 474 |
+ } |
|
| 475 |
+ child, err := daemon.Get(name) |
|
| 476 |
+ if err != nil {
|
|
| 477 |
+ //An error from daemon.Get() means this name could not be found |
|
| 478 |
+ return fmt.Errorf("Could not get container for %s", name)
|
|
| 479 |
+ } |
|
| 480 |
+ for child.hostConfig.NetworkMode.IsContainer() {
|
|
| 481 |
+ parts := strings.SplitN(string(child.hostConfig.NetworkMode), ":", 2) |
|
| 482 |
+ child, err = daemon.Get(parts[1]) |
|
| 483 |
+ if err != nil {
|
|
| 484 |
+ return fmt.Errorf("Could not get container for %s", parts[1])
|
|
| 485 |
+ } |
|
| 486 |
+ } |
|
| 487 |
+ if child.hostConfig.NetworkMode.IsHost() {
|
|
| 488 |
+ return runconfig.ErrConflictHostNetworkAndLinks |
|
| 489 |
+ } |
|
| 490 |
+ if err := daemon.RegisterLink(container, child, alias); err != nil {
|
|
| 491 |
+ return err |
|
| 492 |
+ } |
|
| 493 |
+ } |
|
| 494 |
+ |
|
| 495 |
+ // After we load all the links into the daemon |
|
| 496 |
+ // set them to nil on the hostconfig |
|
| 497 |
+ hostConfig.Links = nil |
|
| 498 |
+ if err := container.WriteHostConfig(); err != nil {
|
|
| 499 |
+ return err |
|
| 500 |
+ } |
|
| 501 |
+ |
|
| 502 |
+ return nil |
|
| 503 |
+} |
| ... | ... |
@@ -8,6 +8,7 @@ import ( |
| 8 | 8 |
|
| 9 | 9 |
"github.com/docker/docker/daemon/graphdriver" |
| 10 | 10 |
"github.com/docker/docker/pkg/archive" |
| 11 |
+ "github.com/docker/docker/pkg/parsers" |
|
| 11 | 12 |
"github.com/docker/docker/runconfig" |
| 12 | 13 |
"github.com/docker/libnetwork" |
| 13 | 14 |
) |
| ... | ... |
@@ -103,3 +104,35 @@ func initNetworkController(config *Config) (libnetwork.NetworkController, error) |
| 103 | 103 |
// TODO Windows |
| 104 | 104 |
return nil, nil |
| 105 | 105 |
} |
| 106 |
+ |
|
| 107 |
+func (daemon *Daemon) RegisterLinks(container *Container, hostConfig *runconfig.HostConfig) error {
|
|
| 108 |
+ // TODO Windows. Factored out for network modes. There may be more |
|
| 109 |
+ // refactoring required here. |
|
| 110 |
+ |
|
| 111 |
+ if hostConfig == nil || hostConfig.Links == nil {
|
|
| 112 |
+ return nil |
|
| 113 |
+ } |
|
| 114 |
+ |
|
| 115 |
+ for _, l := range hostConfig.Links {
|
|
| 116 |
+ name, alias, err := parsers.ParseLink(l) |
|
| 117 |
+ if err != nil {
|
|
| 118 |
+ return err |
|
| 119 |
+ } |
|
| 120 |
+ child, err := daemon.Get(name) |
|
| 121 |
+ if err != nil {
|
|
| 122 |
+ //An error from daemon.Get() means this name could not be found |
|
| 123 |
+ return fmt.Errorf("Could not get container for %s", name)
|
|
| 124 |
+ } |
|
| 125 |
+ if err := daemon.RegisterLink(container, child, alias); err != nil {
|
|
| 126 |
+ return err |
|
| 127 |
+ } |
|
| 128 |
+ } |
|
| 129 |
+ |
|
| 130 |
+ // After we load all the links into the daemon |
|
| 131 |
+ // set them to nil on the hostconfig |
|
| 132 |
+ hostConfig.Links = nil |
|
| 133 |
+ if err := container.WriteHostConfig(); err != nil {
|
|
| 134 |
+ return err |
|
| 135 |
+ } |
|
| 136 |
+ return nil |
|
| 137 |
+} |
| ... | ... |
@@ -16,51 +16,6 @@ type KeyValuePair struct {
|
| 16 | 16 |
|
| 17 | 17 |
type NetworkMode string |
| 18 | 18 |
|
| 19 |
-// IsPrivate indicates whether container use it's private network stack |
|
| 20 |
-func (n NetworkMode) IsPrivate() bool {
|
|
| 21 |
- return !(n.IsHost() || n.IsContainer()) |
|
| 22 |
-} |
|
| 23 |
- |
|
| 24 |
-func (n NetworkMode) IsDefault() bool {
|
|
| 25 |
- return n == "default" |
|
| 26 |
-} |
|
| 27 |
- |
|
| 28 |
-func DefaultDaemonNetworkMode() NetworkMode {
|
|
| 29 |
- return NetworkMode("bridge")
|
|
| 30 |
-} |
|
| 31 |
- |
|
| 32 |
-func (n NetworkMode) NetworkName() string {
|
|
| 33 |
- if n.IsBridge() {
|
|
| 34 |
- return "bridge" |
|
| 35 |
- } else if n.IsHost() {
|
|
| 36 |
- return "host" |
|
| 37 |
- } else if n.IsContainer() {
|
|
| 38 |
- return "container" |
|
| 39 |
- } else if n.IsNone() {
|
|
| 40 |
- return "none" |
|
| 41 |
- } else if n.IsDefault() {
|
|
| 42 |
- return "default" |
|
| 43 |
- } |
|
| 44 |
- return "" |
|
| 45 |
-} |
|
| 46 |
- |
|
| 47 |
-func (n NetworkMode) IsBridge() bool {
|
|
| 48 |
- return n == "bridge" |
|
| 49 |
-} |
|
| 50 |
- |
|
| 51 |
-func (n NetworkMode) IsHost() bool {
|
|
| 52 |
- return n == "host" |
|
| 53 |
-} |
|
| 54 |
- |
|
| 55 |
-func (n NetworkMode) IsContainer() bool {
|
|
| 56 |
- parts := strings.SplitN(string(n), ":", 2) |
|
| 57 |
- return len(parts) > 1 && parts[0] == "container" |
|
| 58 |
-} |
|
| 59 |
- |
|
| 60 |
-func (n NetworkMode) IsNone() bool {
|
|
| 61 |
- return n == "none" |
|
| 62 |
-} |
|
| 63 |
- |
|
| 64 | 19 |
type IpcMode string |
| 65 | 20 |
|
| 66 | 21 |
// IsPrivate indicates whether container use it's private ipc stack |
| 67 | 22 |
new file mode 100644 |
| ... | ... |
@@ -0,0 +1,52 @@ |
| 0 |
+// +build !windows |
|
| 1 |
+ |
|
| 2 |
+package runconfig |
|
| 3 |
+ |
|
| 4 |
+import ( |
|
| 5 |
+ "strings" |
|
| 6 |
+) |
|
| 7 |
+ |
|
| 8 |
+// IsPrivate indicates whether container use it's private network stack |
|
| 9 |
+func (n NetworkMode) IsPrivate() bool {
|
|
| 10 |
+ return !(n.IsHost() || n.IsContainer()) |
|
| 11 |
+} |
|
| 12 |
+ |
|
| 13 |
+func (n NetworkMode) IsDefault() bool {
|
|
| 14 |
+ return n == "default" |
|
| 15 |
+} |
|
| 16 |
+ |
|
| 17 |
+func DefaultDaemonNetworkMode() NetworkMode {
|
|
| 18 |
+ return NetworkMode("bridge")
|
|
| 19 |
+} |
|
| 20 |
+ |
|
| 21 |
+func (n NetworkMode) NetworkName() string {
|
|
| 22 |
+ if n.IsBridge() {
|
|
| 23 |
+ return "bridge" |
|
| 24 |
+ } else if n.IsHost() {
|
|
| 25 |
+ return "host" |
|
| 26 |
+ } else if n.IsContainer() {
|
|
| 27 |
+ return "container" |
|
| 28 |
+ } else if n.IsNone() {
|
|
| 29 |
+ return "none" |
|
| 30 |
+ } else if n.IsDefault() {
|
|
| 31 |
+ return "default" |
|
| 32 |
+ } |
|
| 33 |
+ return "" |
|
| 34 |
+} |
|
| 35 |
+ |
|
| 36 |
+func (n NetworkMode) IsBridge() bool {
|
|
| 37 |
+ return n == "bridge" |
|
| 38 |
+} |
|
| 39 |
+ |
|
| 40 |
+func (n NetworkMode) IsHost() bool {
|
|
| 41 |
+ return n == "host" |
|
| 42 |
+} |
|
| 43 |
+ |
|
| 44 |
+func (n NetworkMode) IsContainer() bool {
|
|
| 45 |
+ parts := strings.SplitN(string(n), ":", 2) |
|
| 46 |
+ return len(parts) > 1 && parts[0] == "container" |
|
| 47 |
+} |
|
| 48 |
+ |
|
| 49 |
+func (n NetworkMode) IsNone() bool {
|
|
| 50 |
+ return n == "none" |
|
| 51 |
+} |
| 0 | 52 |
new file mode 100644 |
| ... | ... |
@@ -0,0 +1,18 @@ |
| 0 |
+// +build !windows |
|
| 1 |
+ |
|
| 2 |
+package runconfig |
|
| 3 |
+ |
|
| 4 |
+func (n NetworkMode) IsDefault() bool {
|
|
| 5 |
+ return n == "default" |
|
| 6 |
+} |
|
| 7 |
+ |
|
| 8 |
+func DefaultDaemonNetworkMode() NetworkMode {
|
|
| 9 |
+ return NetworkMode("default")
|
|
| 10 |
+} |
|
| 11 |
+ |
|
| 12 |
+func (n NetworkMode) NetworkName() string {
|
|
| 13 |
+ if n.IsDefault() {
|
|
| 14 |
+ return "default" |
|
| 15 |
+ } |
|
| 16 |
+ return "" |
|
| 17 |
+} |
| ... | ... |
@@ -24,6 +24,19 @@ var ( |
| 24 | 24 |
ErrConflictNetworkExposePorts = fmt.Errorf("Conflicting options: --expose and the network mode (--expose)")
|
| 25 | 25 |
) |
| 26 | 26 |
|
| 27 |
+// validateNM is the set of fields passed to validateNetMode() |
|
| 28 |
+type validateNM struct {
|
|
| 29 |
+ netMode NetworkMode |
|
| 30 |
+ flHostname *string |
|
| 31 |
+ flLinks opts.ListOpts |
|
| 32 |
+ flDns opts.ListOpts |
|
| 33 |
+ flExtraHosts opts.ListOpts |
|
| 34 |
+ flMacAddress *string |
|
| 35 |
+ flPublish opts.ListOpts |
|
| 36 |
+ flPublishAll *bool |
|
| 37 |
+ flExpose opts.ListOpts |
|
| 38 |
+} |
|
| 39 |
+ |
|
| 27 | 40 |
func Parse(cmd *flag.FlagSet, args []string) (*Config, *HostConfig, *flag.FlagSet, error) {
|
| 28 | 41 |
var ( |
| 29 | 42 |
// FIXME: use utils.ListOpts for attach and volumes? |
| ... | ... |
@@ -121,37 +134,22 @@ func Parse(cmd *flag.FlagSet, args []string) (*Config, *HostConfig, *flag.FlagSe |
| 121 | 121 |
return nil, nil, cmd, fmt.Errorf("--net: invalid net mode: %v", err)
|
| 122 | 122 |
} |
| 123 | 123 |
|
| 124 |
- if (netMode.IsHost() || netMode.IsContainer()) && *flHostname != "" {
|
|
| 125 |
- return nil, nil, cmd, ErrConflictNetworkHostname |
|
| 126 |
- } |
|
| 127 |
- |
|
| 128 |
- if netMode.IsHost() && flLinks.Len() > 0 {
|
|
| 129 |
- return nil, nil, cmd, ErrConflictHostNetworkAndLinks |
|
| 130 |
- } |
|
| 131 |
- |
|
| 132 |
- if netMode.IsContainer() && flLinks.Len() > 0 {
|
|
| 133 |
- return nil, nil, cmd, ErrConflictContainerNetworkAndLinks |
|
| 134 |
- } |
|
| 135 |
- |
|
| 136 |
- if (netMode.IsHost() || netMode.IsContainer()) && flDns.Len() > 0 {
|
|
| 137 |
- return nil, nil, cmd, ErrConflictNetworkAndDns |
|
| 138 |
- } |
|
| 139 |
- |
|
| 140 |
- if (netMode.IsContainer() || netMode.IsHost()) && flExtraHosts.Len() > 0 {
|
|
| 141 |
- return nil, nil, cmd, ErrConflictNetworkHosts |
|
| 124 |
+ vals := validateNM{
|
|
| 125 |
+ netMode: netMode, |
|
| 126 |
+ flHostname: flHostname, |
|
| 127 |
+ flLinks: flLinks, |
|
| 128 |
+ flDns: flDns, |
|
| 129 |
+ flExtraHosts: flExtraHosts, |
|
| 130 |
+ flMacAddress: flMacAddress, |
|
| 131 |
+ flPublish: flPublish, |
|
| 132 |
+ flPublishAll: flPublishAll, |
|
| 133 |
+ flExpose: flExpose, |
|
| 142 | 134 |
} |
| 143 | 135 |
|
| 144 |
- if (netMode.IsContainer() || netMode.IsHost()) && *flMacAddress != "" {
|
|
| 145 |
- return nil, nil, cmd, ErrConflictContainerNetworkAndMac |
|
| 146 |
- } |
|
| 147 |
- |
|
| 148 |
- if netMode.IsContainer() && (flPublish.Len() > 0 || *flPublishAll == true) {
|
|
| 149 |
- return nil, nil, cmd, ErrConflictNetworkPublishPorts |
|
| 136 |
+ if err := validateNetMode(&vals); err != nil {
|
|
| 137 |
+ return nil, nil, cmd, err |
|
| 150 | 138 |
} |
| 151 | 139 |
|
| 152 |
- if netMode.IsContainer() && flExpose.Len() > 0 {
|
|
| 153 |
- return nil, nil, cmd, ErrConflictNetworkExposePorts |
|
| 154 |
- } |
|
| 155 | 140 |
// Validate the input mac address |
| 156 | 141 |
if *flMacAddress != "" {
|
| 157 | 142 |
if _, err := opts.ValidateMACAddress(*flMacAddress); err != nil {
|
| ... | ... |
@@ -463,20 +461,6 @@ func parseKeyValueOpts(opts opts.ListOpts) ([]KeyValuePair, error) {
|
| 463 | 463 |
return out, nil |
| 464 | 464 |
} |
| 465 | 465 |
|
| 466 |
-func parseNetMode(netMode string) (NetworkMode, error) {
|
|
| 467 |
- parts := strings.Split(netMode, ":") |
|
| 468 |
- switch mode := parts[0]; mode {
|
|
| 469 |
- case "default", "bridge", "none", "host": |
|
| 470 |
- case "container": |
|
| 471 |
- if len(parts) < 2 || parts[1] == "" {
|
|
| 472 |
- return "", fmt.Errorf("invalid container format container:<name|id>")
|
|
| 473 |
- } |
|
| 474 |
- default: |
|
| 475 |
- return "", fmt.Errorf("invalid --net: %s", netMode)
|
|
| 476 |
- } |
|
| 477 |
- return NetworkMode(netMode), nil |
|
| 478 |
-} |
|
| 479 |
- |
|
| 480 | 466 |
func ParseDevice(device string) (DeviceMapping, error) {
|
| 481 | 467 |
src := "" |
| 482 | 468 |
dst := "" |
| 483 | 469 |
new file mode 100644 |
| ... | ... |
@@ -0,0 +1,58 @@ |
| 0 |
+// +build !windows |
|
| 1 |
+ |
|
| 2 |
+package runconfig |
|
| 3 |
+ |
|
| 4 |
+import ( |
|
| 5 |
+ "fmt" |
|
| 6 |
+ "strings" |
|
| 7 |
+) |
|
| 8 |
+ |
|
| 9 |
+func parseNetMode(netMode string) (NetworkMode, error) {
|
|
| 10 |
+ parts := strings.Split(netMode, ":") |
|
| 11 |
+ switch mode := parts[0]; mode {
|
|
| 12 |
+ case "default", "bridge", "none", "host": |
|
| 13 |
+ case "container": |
|
| 14 |
+ if len(parts) < 2 || parts[1] == "" {
|
|
| 15 |
+ return "", fmt.Errorf("invalid container format container:<name|id>")
|
|
| 16 |
+ } |
|
| 17 |
+ default: |
|
| 18 |
+ return "", fmt.Errorf("invalid --net: %s", netMode)
|
|
| 19 |
+ } |
|
| 20 |
+ return NetworkMode(netMode), nil |
|
| 21 |
+} |
|
| 22 |
+ |
|
| 23 |
+func validateNetMode(vals *validateNM) error {
|
|
| 24 |
+ |
|
| 25 |
+ if (vals.netMode.IsHost() || vals.netMode.IsContainer()) && *vals.flHostname != "" {
|
|
| 26 |
+ return ErrConflictNetworkHostname |
|
| 27 |
+ } |
|
| 28 |
+ |
|
| 29 |
+ if vals.netMode.IsHost() && vals.flLinks.Len() > 0 {
|
|
| 30 |
+ return ErrConflictHostNetworkAndLinks |
|
| 31 |
+ } |
|
| 32 |
+ |
|
| 33 |
+ if vals.netMode.IsContainer() && vals.flLinks.Len() > 0 {
|
|
| 34 |
+ return ErrConflictContainerNetworkAndLinks |
|
| 35 |
+ } |
|
| 36 |
+ |
|
| 37 |
+ if (vals.netMode.IsHost() || vals.netMode.IsContainer()) && vals.flDns.Len() > 0 {
|
|
| 38 |
+ return ErrConflictNetworkAndDns |
|
| 39 |
+ } |
|
| 40 |
+ |
|
| 41 |
+ if (vals.netMode.IsContainer() || vals.netMode.IsHost()) && vals.flExtraHosts.Len() > 0 {
|
|
| 42 |
+ return ErrConflictNetworkHosts |
|
| 43 |
+ } |
|
| 44 |
+ |
|
| 45 |
+ if (vals.netMode.IsContainer() || vals.netMode.IsHost()) && *vals.flMacAddress != "" {
|
|
| 46 |
+ return ErrConflictContainerNetworkAndMac |
|
| 47 |
+ } |
|
| 48 |
+ |
|
| 49 |
+ if vals.netMode.IsContainer() && (vals.flPublish.Len() > 0 || *vals.flPublishAll == true) {
|
|
| 50 |
+ return ErrConflictNetworkPublishPorts |
|
| 51 |
+ } |
|
| 52 |
+ |
|
| 53 |
+ if vals.netMode.IsContainer() && vals.flExpose.Len() > 0 {
|
|
| 54 |
+ return ErrConflictNetworkExposePorts |
|
| 55 |
+ } |
|
| 56 |
+ return nil |
|
| 57 |
+} |
| 0 | 58 |
new file mode 100644 |
| ... | ... |
@@ -0,0 +1,20 @@ |
| 0 |
+package runconfig |
|
| 1 |
+ |
|
| 2 |
+import ( |
|
| 3 |
+ "fmt" |
|
| 4 |
+ "strings" |
|
| 5 |
+) |
|
| 6 |
+ |
|
| 7 |
+func parseNetMode(netMode string) (NetworkMode, error) {
|
|
| 8 |
+ parts := strings.Split(netMode, ":") |
|
| 9 |
+ switch mode := parts[0]; mode {
|
|
| 10 |
+ case "default": |
|
| 11 |
+ default: |
|
| 12 |
+ return "", fmt.Errorf("invalid --net: %s", netMode)
|
|
| 13 |
+ } |
|
| 14 |
+ return NetworkMode(netMode), nil |
|
| 15 |
+} |
|
| 16 |
+ |
|
| 17 |
+func validateNetMode(vals *validateNM) error {
|
|
| 18 |
+ return nil |
|
| 19 |
+} |