Skip to content

Commit 638a809

Browse files
authored
Merge pull request #271 from mrunalp/network_netns
Add support for --network=netns:/proc/pid/ns/net
2 parents 1a89821 + ff4e3a7 commit 638a809

4 files changed

Lines changed: 18 additions & 3 deletions

File tree

daemon/container_operations.go

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -339,7 +339,7 @@ func (daemon *Daemon) updateContainerNetworkSettings(container *container.Contai
339339
)
340340

341341
mode := container.HostConfig.NetworkMode
342-
if container.Config.NetworkDisabled || mode.IsContainer() {
342+
if container.Config.NetworkDisabled || mode.IsContainer() || mode.IsNetNs() {
343343
return nil
344344
}
345345

@@ -397,7 +397,7 @@ func (daemon *Daemon) allocateNetwork(container *container.Container) error {
397397

398398
updateSettings := false
399399
if len(container.NetworkSettings.Networks) == 0 {
400-
if container.Config.NetworkDisabled || container.HostConfig.NetworkMode.IsContainer() {
400+
if container.Config.NetworkDisabled || container.HostConfig.NetworkMode.IsContainer() || container.HostConfig.NetworkMode.IsNetNs() {
401401
return nil
402402
}
403403

@@ -729,7 +729,7 @@ func (daemon *Daemon) releaseNetwork(container *container.Container) {
729729
if daemon.netController == nil {
730730
return
731731
}
732-
if container.HostConfig.NetworkMode.IsContainer() || container.Config.NetworkDisabled {
732+
if container.HostConfig.NetworkMode.IsContainer() || container.HostConfig.NetworkMode.IsNetNs() || container.Config.NetworkDisabled {
733733
return
734734
}
735735

daemon/oci_linux.go

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -270,6 +270,8 @@ func setNamespaces(daemon *Daemon, s *specs.Spec, c *container.Container) error
270270
nsUser.Path = fmt.Sprintf("/proc/%d/ns/user", nc.State.GetPID())
271271
setNamespace(s, nsUser)
272272
}
273+
} else if parts[0] == "netns" {
274+
ns.Path = parts[1]
273275
} else if c.HostConfig.NetworkMode.IsHost() {
274276
ns.Path = c.NetworkSettings.SandboxKey
275277
}

runconfig/hostconfig_unix.go

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -35,6 +35,13 @@ func ValidateNetMode(c *container.Config, hc *container.HostConfig) error {
3535
return fmt.Errorf("--net: invalid net mode: invalid container format container:<name|id>")
3636
}
3737
}
38+
if parts[0] == "netns" {
39+
if len(parts) < 2 || parts[1] == "" {
40+
return fmt.Errorf("--net: invalid net mode: invalid netns format netns:/path/to/netns")
41+
} else {
42+
return nil
43+
}
44+
}
3845

3946
if hc.NetworkMode.IsContainer() && c.Hostname != "" {
4047
return ErrConflictNetworkHostname

vendor/src/github.com/docker/engine-api/types/container/hostconfig_unix.go

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -53,6 +53,12 @@ func (n NetworkMode) IsContainer() bool {
5353
return len(parts) > 1 && parts[0] == "container"
5454
}
5555

56+
// IsNetNs indicates whether container uses a container network namespace path.
57+
func (n NetworkMode) IsNetNs() bool {
58+
parts := strings.SplitN(string(n), ":", 2)
59+
return len(parts) > 1 && parts[0] == "netns"
60+
}
61+
5662
// IsNone indicates whether container isn't using a network stack.
5763
func (n NetworkMode) IsNone() bool {
5864
return n == "none"

0 commit comments

Comments
 (0)