Skip to content

Commit c1e6d20

Browse files
authored
Merge pull request #27 from arangodb-helper/custom-network-namespace
Custom network namespace
2 parents a60a518 + d65c40b commit c1e6d20

File tree

5 files changed

+58
-30
lines changed

5 files changed

+58
-30
lines changed

README.md

Lines changed: 10 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -259,16 +259,23 @@ of the process in the Docker container.
259259
`endpoint` is the URL used to reach the docker host. This is needed to run
260260
the executable in docker. The default value is "unix:///var/run/docker.sock".
261261

262-
* `--dockerNetHost bool`
262+
* `--dockerNetworkMode mode`
263263

264-
If `dockerNetHost` is set, all docker container will be started
265-
with the `--net=host` option.
264+
If `dockerNetworkMode` is set, all docker container will be started
265+
with the `--net=<mode>` option.
266266

267267
* `--dockerPrivileged bool`
268268

269269
If `dockerPrivileged` is set, all docker container will be started
270270
with the `--privileged` option turned on.
271271

272+
* `--dockerNetHost bool` (deprecated)
273+
274+
If `dockerNetHost` is set, all docker container will be started
275+
with the `--net=host` option.
276+
277+
This option is deprecated, use `--dockerNetworkMode=host` instead.
278+
272279
HTTP API
273280
--------
274281

main.go

Lines changed: 12 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -59,7 +59,8 @@ var (
5959
dockerUser string
6060
dockerContainer string
6161
dockerGCDelay time.Duration
62-
dockerNetHost bool
62+
dockerNetHost bool // Deprecated
63+
dockerNetworkMode string
6364
dockerPrivileged bool
6465
)
6566

@@ -83,7 +84,8 @@ func init() {
8384
f.StringVar(&dockerUser, "dockerUser", "", "use the given name as user to run the Docker container")
8485
f.StringVar(&dockerContainer, "dockerContainer", "", "name of the docker container that is running this process")
8586
f.DurationVar(&dockerGCDelay, "dockerGCDelay", defaultDockerGCDelay, "Delay before stopped containers are garbage collected")
86-
f.BoolVar(&dockerNetHost, "dockerNetHost", false, "Run containers with --net=host")
87+
f.BoolVar(&dockerNetHost, "dockerNetHost", false, "Run containers with --net=host. (deprecated, use --dockerNetworkMode=host instead)")
88+
f.StringVar(&dockerNetworkMode, "dockerNetworkMode", "", "Run containers with --net=<value>")
8789
f.BoolVar(&dockerPrivileged, "dockerPrivileged", false, "Run containers with --privileged")
8890
f.BoolVar(&allPortOffsetsUnique, "uniquePortOffsets", false, "If set, all peers will get a unique port offset. If false (default) only portOffset+peerAddress pairs will be unique.")
8991
f.StringVar(&jwtSecretFile, "jwtSecretFile", "", "name of a plain text file containing a JWT secret used for server authentication")
@@ -192,6 +194,13 @@ func cmdMainRun(cmd *cobra.Command, args []string) {
192194
if dockerImage != "" && rrPath != "" {
193195
log.Fatal("Error: using --dockerImage and --rr is not possible.")
194196
}
197+
if dockerNetHost {
198+
if dockerNetworkMode == "" {
199+
dockerNetworkMode = "host"
200+
} else if dockerNetworkMode != "host" {
201+
log.Fatal("Error: cannot set --dockerNetHost and --dockerNetworkMode at the same time")
202+
}
203+
}
195204
log.Debugf("Using %s as default arangod executable.", arangodExecutable)
196205
log.Debugf("Using %s as default JS dir.", arangodJSstartup)
197206

@@ -269,7 +278,7 @@ func cmdMainRun(cmd *cobra.Command, args []string) {
269278
DockerImage: dockerImage,
270279
DockerUser: dockerUser,
271280
DockerGCDelay: dockerGCDelay,
272-
DockerNetHost: dockerNetHost,
281+
DockerNetworkMode: dockerNetworkMode,
273282
DockerPrivileged: dockerPrivileged,
274283
ProjectVersion: projectVersion,
275284
ProjectBuild: projectBuild,

service/arangodb.go

Lines changed: 14 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -39,14 +39,14 @@ type ServiceConfig struct {
3939
SslKeyFile string // Path containing an x509 certificate + private key to be used by the servers.
4040
SslCAFile string // Path containing an x509 CA certificate used to authenticate clients.
4141

42-
DockerContainer string // Name of the container running this process
43-
DockerEndpoint string // Where to reach the docker daemon
44-
DockerImage string // Name of Arangodb docker image
45-
DockerUser string
46-
DockerGCDelay time.Duration
47-
DockerNetHost bool
48-
DockerPrivileged bool
49-
RunningInDocker bool
42+
DockerContainer string // Name of the container running this process
43+
DockerEndpoint string // Where to reach the docker daemon
44+
DockerImage string // Name of Arangodb docker image
45+
DockerUser string
46+
DockerGCDelay time.Duration
47+
DockerNetworkMode string
48+
DockerPrivileged bool
49+
RunningInDocker bool
5050

5151
ProjectVersion string
5252
ProjectBuild string
@@ -565,11 +565,15 @@ func (s *Service) Run(rootCtx context.Context) {
565565
if s.OwnAddress == "" {
566566
s.log.Fatal("OwnAddress must be specified")
567567
}
568-
hostPort, isNetHost, err := findDockerExposedAddress(s.DockerEndpoint, s.DockerContainer, s.MasterPort)
568+
hostPort, isNetHost, networkMode, err := findDockerExposedAddress(s.DockerEndpoint, s.DockerContainer, s.MasterPort)
569569
if err != nil {
570570
s.log.Fatalf("Failed to detect port mapping: %#v", err)
571571
return
572572
}
573+
if s.DockerNetworkMode == "" && networkMode != "" && networkMode != "default" {
574+
s.log.Infof("Auto detected network mode: %s", networkMode)
575+
s.DockerNetworkMode = networkMode
576+
}
573577
s.announcePort = hostPort
574578
s.isNetHost = isNetHost
575579
} else {
@@ -581,7 +585,7 @@ func (s *Service) Run(rootCtx context.Context) {
581585
var runner Runner
582586
if s.DockerEndpoint != "" && s.DockerImage != "" {
583587
var err error
584-
runner, err = NewDockerRunner(s.log, s.DockerEndpoint, s.DockerImage, s.DockerUser, s.DockerContainer, s.DockerGCDelay, s.DockerNetHost, s.DockerPrivileged)
588+
runner, err = NewDockerRunner(s.log, s.DockerEndpoint, s.DockerImage, s.DockerUser, s.DockerContainer, s.DockerGCDelay, s.DockerNetworkMode, s.DockerPrivileged)
585589
if err != nil {
586590
s.log.Fatalf("Failed to create docker runner: %#v", err)
587591
}

service/docker.go

Lines changed: 10 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -3,34 +3,36 @@ package service
33
import (
44
"fmt"
55
"strconv"
6+
"strings"
67

78
docker "github.com/fsouza/go-dockerclient"
89
)
910

1011
// findDockerExposedAddress looks up the external port number to which the given
1112
// port is mapped onto for the given container.
12-
func findDockerExposedAddress(dockerEndpoint, containerName string, port int) (hostPort int, isNetHost bool, err error) {
13+
func findDockerExposedAddress(dockerEndpoint, containerName string, port int) (hostPort int, isNetHost bool, networkMode string, err error) {
1314
client, err := docker.NewClient(dockerEndpoint)
1415
if err != nil {
15-
return 0, false, maskAny(err)
16+
return 0, false, "", maskAny(err)
1617
}
1718
container, err := client.InspectContainer(containerName)
1819
if err != nil {
19-
return 0, false, maskAny(err)
20+
return 0, false, "", maskAny(err)
2021
}
21-
isNetHost = container.HostConfig.NetworkMode == "host"
22+
networkMode = container.HostConfig.NetworkMode
23+
isNetHost = networkMode == "host" || strings.HasPrefix(networkMode, "container:")
2224
if isNetHost {
2325
// There is no port mapping for `--net=host`
24-
return port, isNetHost, nil
26+
return port, isNetHost, networkMode, nil
2527
}
2628
dockerPort := docker.Port(fmt.Sprintf("%d/tcp", port))
2729
bindings, ok := container.NetworkSettings.Ports[dockerPort]
2830
if !ok || len(bindings) == 0 {
29-
return 0, isNetHost, maskAny(fmt.Errorf("Cannot find port binding for TCP port %d", port))
31+
return 0, isNetHost, networkMode, maskAny(fmt.Errorf("Cannot find port binding for TCP port %d", port))
3032
}
3133
hostPort, err = strconv.Atoi(bindings[0].HostPort)
3234
if err != nil {
33-
return 0, isNetHost, maskAny(err)
35+
return 0, isNetHost, networkMode, maskAny(err)
3436
}
35-
return hostPort, isNetHost, nil
37+
return hostPort, isNetHost, networkMode, nil
3638
}

service/runner_docker.go

Lines changed: 12 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -22,7 +22,7 @@ const (
2222
)
2323

2424
// NewDockerRunner creates a runner that starts processes on the local OS.
25-
func NewDockerRunner(log *logging.Logger, endpoint, image, user, volumesFrom string, gcDelay time.Duration, netHost, privileged bool) (Runner, error) {
25+
func NewDockerRunner(log *logging.Logger, endpoint, image, user, volumesFrom string, gcDelay time.Duration, networkMode string, privileged bool) (Runner, error) {
2626
client, err := docker.NewClient(endpoint)
2727
if err != nil {
2828
return nil, maskAny(err)
@@ -35,7 +35,7 @@ func NewDockerRunner(log *logging.Logger, endpoint, image, user, volumesFrom str
3535
volumesFrom: volumesFrom,
3636
containerIDs: make(map[string]time.Time),
3737
gcDelay: gcDelay,
38-
netHost: netHost,
38+
networkMode: networkMode,
3939
privileged: privileged,
4040
}, nil
4141
}
@@ -51,7 +51,7 @@ type dockerRunner struct {
5151
containerIDs map[string]time.Time
5252
gcOnce sync.Once
5353
gcDelay time.Duration
54-
netHost bool
54+
networkMode string
5555
privileged bool
5656
}
5757

@@ -173,8 +173,8 @@ func (r *dockerRunner) start(command string, args []string, volumes []Volume, po
173173
opts.HostConfig.Binds = append(opts.HostConfig.Binds, bind)
174174
}
175175
}
176-
if r.netHost {
177-
opts.HostConfig.NetworkMode = "host"
176+
if r.networkMode != "" && r.networkMode != "default" {
177+
opts.HostConfig.NetworkMode = r.networkMode
178178
} else {
179179
for _, p := range ports {
180180
dockerPort := docker.Port(fmt.Sprintf("%d/tcp", p))
@@ -248,9 +248,15 @@ func (r *dockerRunner) CreateStartArangodbCommand(index int, masterIP string, ma
248248
masterPortI, _ := strconv.Atoi(masterPort)
249249
hostPort = masterPortI + (portOffsetIncrement * (index - 1))
250250
}
251+
var netArgs string
252+
if r.networkMode == "" || r.networkMode == "default" {
253+
netArgs = fmt.Sprintf("-p %d:4000", hostPort)
254+
} else {
255+
netArgs = fmt.Sprintf("--net=%s", r.networkMode)
256+
}
251257
lines := []string{
252258
fmt.Sprintf("docker volume create arangodb%d &&", index),
253-
fmt.Sprintf("docker run -it --name=adb%d --rm -p %d:4000 -v arangodb%d:/data -v /var/run/docker.sock:/var/run/docker.sock arangodb/arangodb-starter", index, hostPort, index),
259+
fmt.Sprintf("docker run -it --name=adb%d --rm %s -v arangodb%d:/data -v /var/run/docker.sock:/var/run/docker.sock arangodb/arangodb-starter", index, netArgs, index),
254260
fmt.Sprintf("--dockerContainer=adb%d --ownAddress=%s --join=%s", index, masterIP, addr),
255261
}
256262
return strings.Join(lines, " \\\n ")

0 commit comments

Comments
 (0)