From f7c7f7978cf0ca94da5cc68ec2634b5a22ae329c Mon Sep 17 00:00:00 2001 From: Josh Poimboeuf Date: Tue, 29 Oct 2013 13:31:00 -0500 Subject: [PATCH 1/2] dockerinit: set hostname Set the hostname in dockerinit instead of with lxc utils. libvirt-lxc doesn't have a way to do this, so do it in a common place. --- lxc_template.go | 7 ------- lxc_template_unit_test.go | 2 -- sysinit/sysinit.go | 22 ++++++++++++++++++++++ 3 files changed, 22 insertions(+), 9 deletions(-) diff --git a/lxc_template.go b/lxc_template.go index 8e6c6ef1ea..a8e11967d1 100644 --- a/lxc_template.go +++ b/lxc_template.go @@ -6,13 +6,6 @@ import ( ) const LxcTemplate = ` -# hostname -{{if .Config.Hostname}} -lxc.utsname = {{.Config.Hostname}} -{{else}} -lxc.utsname = {{.Id}} -{{end}} - {{if .Config.NetworkDisabled}} # network is disabled (-n=false) lxc.network.type = empty diff --git a/lxc_template_unit_test.go b/lxc_template_unit_test.go index ccdfec8890..f71f1dd6f5 100644 --- a/lxc_template_unit_test.go +++ b/lxc_template_unit_test.go @@ -29,7 +29,6 @@ func TestLXCConfig(t *testing.T) { container := &Container{ root: root, Config: &Config{ - Hostname: "foobar", Memory: int64(mem), CpuShares: int64(cpu), NetworkDisabled: true, @@ -41,7 +40,6 @@ func TestLXCConfig(t *testing.T) { if err := container.generateLXCConfig(); err != nil { t.Fatal(err) } - grepFile(t, container.lxcConfigPath(), "lxc.utsname = foobar") grepFile(t, container.lxcConfigPath(), fmt.Sprintf("lxc.cgroup.memory.limit_in_bytes = %d", mem)) grepFile(t, container.lxcConfigPath(), diff --git a/sysinit/sysinit.go b/sysinit/sysinit.go index 220f446d62..d6ba3a5d83 100644 --- a/sysinit/sysinit.go +++ b/sysinit/sysinit.go @@ -26,6 +26,14 @@ type DockerInitArgs struct { args []string } +func setupHostname(args *DockerInitArgs) error { + hostname := getEnv(args, "HOSTNAME") + if hostname == "" { + return nil + } + return syscall.Sethostname([]byte(hostname)) +} + // Setup networking func setupNetworking(args *DockerInitArgs) error { if args.gateway == "" { @@ -132,9 +140,23 @@ func setupEnv(args *DockerInitArgs) { } } +func getEnv(args *DockerInitArgs, key string) string { + for _, kv := range args.env { + parts := strings.SplitN(kv, "=", 2) + if parts[0] == key && len(parts) == 2 { + return parts[1] + } + } + return "" +} + func executeProgram(args *DockerInitArgs) error { setupEnv(args) + if err := setupHostname(args); err != nil { + return err + } + if err := setupNetworking(args); err != nil { return err } From ecc51cd465da56b38190fe852cf9f31bdfbb0fdc Mon Sep 17 00:00:00 2001 From: Josh Poimboeuf Date: Tue, 29 Oct 2013 13:37:00 -0500 Subject: [PATCH 2/2] dockerinit: set IP address Set the IP address in dockerinit instead of lxc utils, to prepare for using libvirt-lxc. --- container.go | 6 +++++- lxc_template.go | 2 -- sysinit/sysinit.go | 43 +++++++++++++++++++++++++++++++++++-------- 3 files changed, 40 insertions(+), 11 deletions(-) diff --git a/container.go b/container.go index 2307948e26..9a502dc190 100644 --- a/container.go +++ b/container.go @@ -574,7 +574,11 @@ func (container *Container) Start() (err error) { // Networking if !container.Config.NetworkDisabled { - params = append(params, "-g", container.network.Gateway.String()) + network := container.NetworkSettings + params = append(params, + "-g", network.Gateway, + "-i", fmt.Sprintf("%s/%d", network.IPAddress, network.IPPrefixLen), + ) } // User diff --git a/lxc_template.go b/lxc_template.go index a8e11967d1..ba5a8d5b82 100644 --- a/lxc_template.go +++ b/lxc_template.go @@ -12,11 +12,9 @@ lxc.network.type = empty {{else}} # network configuration lxc.network.type = veth -lxc.network.flags = up lxc.network.link = {{.NetworkSettings.Bridge}} lxc.network.name = eth0 lxc.network.mtu = 1500 -lxc.network.ipv4 = {{.NetworkSettings.IPAddress}}/{{.NetworkSettings.IPPrefixLen}} {{end}} # root filesystem diff --git a/sysinit/sysinit.go b/sysinit/sysinit.go index d6ba3a5d83..e7a9e229ec 100644 --- a/sysinit/sysinit.go +++ b/sysinit/sysinit.go @@ -20,6 +20,7 @@ import ( type DockerInitArgs struct { user string gateway string + ip string workDir string privileged bool env []string @@ -36,17 +37,41 @@ func setupHostname(args *DockerInitArgs) error { // Setup networking func setupNetworking(args *DockerInitArgs) error { - if args.gateway == "" { - return nil - } + if args.ip != "" { + // eth0 + iface, err := net.InterfaceByName("eth0") + if err != nil { + return fmt.Errorf("Unable to set up networking: %v", err) + } + ip, ipNet, err := net.ParseCIDR(args.ip) + if err != nil { + return fmt.Errorf("Unable to set up networking: %v", err) + } + if err := netlink.NetworkLinkAddIp(iface, ip, ipNet); err != nil { + return fmt.Errorf("Unable to set up networking: %v", err) + } + if err := netlink.NetworkLinkUp(iface); err != nil { + return fmt.Errorf("Unable to set up networking: %v", err) + } - ip := net.ParseIP(args.gateway) - if ip == nil { - return fmt.Errorf("Unable to set up networking, %s is not a valid IP", args.gateway) + // loopback + iface, err = net.InterfaceByName("lo") + if err != nil { + return fmt.Errorf("Unable to set up networking: %v", err) + } + if err := netlink.NetworkLinkUp(iface); err != nil { + return fmt.Errorf("Unable to set up networking: %v", err) + } } + if args.gateway != "" { + gw := net.ParseIP(args.gateway) + if gw == nil { + return fmt.Errorf("Unable to set up networking, %s is not a valid gateway IP", args.gateway) + } - if err := netlink.AddDefaultGw(ip); err != nil { - return fmt.Errorf("Unable to set up networking: %v", err) + if err := netlink.AddDefaultGw(gw); err != nil { + return fmt.Errorf("Unable to set up networking: %v", err) + } } return nil @@ -199,6 +224,7 @@ func SysInit() { // Get cmdline arguments user := flag.String("u", "", "username or uid") gateway := flag.String("g", "", "gateway address") + ip := flag.String("i", "", "ip address") workDir := flag.String("w", "", "workdir") privileged := flag.Bool("privileged", false, "privileged mode") flag.Parse() @@ -216,6 +242,7 @@ func SysInit() { args := &DockerInitArgs{ user: *user, gateway: *gateway, + ip: *ip, workDir: *workDir, privileged: *privileged, env: env,