Browse code

dockerinit: set IP address

Set the IP address in dockerinit instead of lxc utils, to prepare for
using libvirt-lxc.

Josh Poimboeuf authored on 2013/10/30 03:37:00
Showing 3 changed files
... ...
@@ -574,7 +574,11 @@ func (container *Container) Start() (err error) {
574 574
 
575 575
 	// Networking
576 576
 	if !container.Config.NetworkDisabled {
577
-		params = append(params, "-g", container.network.Gateway.String())
577
+		network := container.NetworkSettings
578
+		params = append(params,
579
+			"-g", network.Gateway,
580
+			"-i", fmt.Sprintf("%s/%d", network.IPAddress, network.IPPrefixLen),
581
+		)
578 582
 	}
579 583
 
580 584
 	// User
... ...
@@ -12,11 +12,9 @@ lxc.network.type = empty
12 12
 {{else}}
13 13
 # network configuration
14 14
 lxc.network.type = veth
15
-lxc.network.flags = up
16 15
 lxc.network.link = {{.NetworkSettings.Bridge}}
17 16
 lxc.network.name = eth0
18 17
 lxc.network.mtu = 1500
19
-lxc.network.ipv4 = {{.NetworkSettings.IPAddress}}/{{.NetworkSettings.IPPrefixLen}}
20 18
 {{end}}
21 19
 
22 20
 # root filesystem
... ...
@@ -20,6 +20,7 @@ import (
20 20
 type DockerInitArgs struct {
21 21
 	user       string
22 22
 	gateway    string
23
+	ip         string
23 24
 	workDir    string
24 25
 	privileged bool
25 26
 	env        []string
... ...
@@ -36,17 +37,41 @@ func setupHostname(args *DockerInitArgs) error {
36 36
 
37 37
 // Setup networking
38 38
 func setupNetworking(args *DockerInitArgs) error {
39
-	if args.gateway == "" {
40
-		return nil
41
-	}
39
+	if args.ip != "" {
40
+		// eth0
41
+		iface, err := net.InterfaceByName("eth0")
42
+		if err != nil {
43
+			return fmt.Errorf("Unable to set up networking: %v", err)
44
+		}
45
+		ip, ipNet, err := net.ParseCIDR(args.ip)
46
+		if err != nil {
47
+			return fmt.Errorf("Unable to set up networking: %v", err)
48
+		}
49
+		if err := netlink.NetworkLinkAddIp(iface, ip, ipNet); err != nil {
50
+			return fmt.Errorf("Unable to set up networking: %v", err)
51
+		}
52
+		if err := netlink.NetworkLinkUp(iface); err != nil {
53
+			return fmt.Errorf("Unable to set up networking: %v", err)
54
+		}
42 55
 
43
-	ip := net.ParseIP(args.gateway)
44
-	if ip == nil {
45
-		return fmt.Errorf("Unable to set up networking, %s is not a valid IP", args.gateway)
56
+		// loopback
57
+		iface, err = net.InterfaceByName("lo")
58
+		if err != nil {
59
+			return fmt.Errorf("Unable to set up networking: %v", err)
60
+		}
61
+		if err := netlink.NetworkLinkUp(iface); err != nil {
62
+			return fmt.Errorf("Unable to set up networking: %v", err)
63
+		}
46 64
 	}
65
+	if args.gateway != "" {
66
+		gw := net.ParseIP(args.gateway)
67
+		if gw == nil {
68
+			return fmt.Errorf("Unable to set up networking, %s is not a valid gateway IP", args.gateway)
69
+		}
47 70
 
48
-	if err := netlink.AddDefaultGw(ip); err != nil {
49
-		return fmt.Errorf("Unable to set up networking: %v", err)
71
+		if err := netlink.AddDefaultGw(gw); err != nil {
72
+			return fmt.Errorf("Unable to set up networking: %v", err)
73
+		}
50 74
 	}
51 75
 
52 76
 	return nil
... ...
@@ -199,6 +224,7 @@ func SysInit() {
199 199
 	// Get cmdline arguments
200 200
 	user := flag.String("u", "", "username or uid")
201 201
 	gateway := flag.String("g", "", "gateway address")
202
+	ip := flag.String("i", "", "ip address")
202 203
 	workDir := flag.String("w", "", "workdir")
203 204
 	privileged := flag.Bool("privileged", false, "privileged mode")
204 205
 	flag.Parse()
... ...
@@ -216,6 +242,7 @@ func SysInit() {
216 216
 	args := &DockerInitArgs{
217 217
 		user:       *user,
218 218
 		gateway:    *gateway,
219
+		ip:         *ip,
219 220
 		workDir:    *workDir,
220 221
 		privileged: *privileged,
221 222
 		env:        env,