From 0a436e03b8289510ad191a89fcbd5ec06fb8865d Mon Sep 17 00:00:00 2001 From: Victor Vieux Date: Thu, 29 Aug 2013 22:21:32 +0000 Subject: [PATCH 1/3] add domainname support --- container.go | 25 +++++++++++++++++++------ sysinit.go | 5 ++++- 2 files changed, 23 insertions(+), 7 deletions(-) diff --git a/container.go b/container.go index 39c19c53d..488cba322 100644 --- a/container.go +++ b/container.go @@ -11,6 +11,7 @@ import ( "io" "io/ioutil" "log" + "net" "os" "os/exec" "path" @@ -20,7 +21,6 @@ import ( "strings" "syscall" "time" - "net" ) type Container struct { @@ -61,6 +61,7 @@ type Container struct { type Config struct { Hostname string + Domainname string User string Memory int64 // Memory limit (in bytes) MemorySwap int64 // Total memory usage (memory + swap); set `-1' to disable swap @@ -203,8 +204,17 @@ func ParseRun(args []string, capabilities *Capabilities) (*Config, *HostConfig, return nil, nil, cmd, err } + hostname := *flHostname + domainname := "" + + parts := strings.SplitN(hostname, ".", 2) + if len(parts) > 1 { + hostname = parts[0] + domainname = parts[1] + } config := &Config{ - Hostname: *flHostname, + Hostname: hostname, + Domainname: domainname, PortSpecs: flPorts, User: *flUser, Tty: *flTty, @@ -692,6 +702,9 @@ func (container *Container) Start(hostConfig *HostConfig) error { params = append(params, "-e", "TERM=xterm") } + params = append(params, "-h", container.Config.Hostname) + params = append(params, "-d", container.Config.Domainname) + // Setup environment params = append(params, "-e", "HOME=/", @@ -813,10 +826,10 @@ func (container *Container) allocateNetwork() error { iface = &NetworkInterface{disabled: true} } else { iface = &NetworkInterface{ - IPNet: net.IPNet{IP: net.ParseIP(container.NetworkSettings.IPAddress), Mask: manager.bridgeNetwork.Mask}, + IPNet: net.IPNet{IP: net.ParseIP(container.NetworkSettings.IPAddress), Mask: manager.bridgeNetwork.Mask}, Gateway: manager.bridgeNetwork.IP, manager: manager, - } + } ipNum := ipToInt(iface.IPNet.IP) manager.ipAllocator.inUse[ipNum] = struct{}{} } @@ -827,10 +840,10 @@ func (container *Container) allocateNetwork() error { portSpecs = container.Config.PortSpecs } else { for backend, frontend := range container.NetworkSettings.PortMapping["Tcp"] { - portSpecs = append(portSpecs, fmt.Sprintf("%s:%s/tcp",frontend, backend)) + portSpecs = append(portSpecs, fmt.Sprintf("%s:%s/tcp", frontend, backend)) } for backend, frontend := range container.NetworkSettings.PortMapping["Udp"] { - portSpecs = append(portSpecs, fmt.Sprintf("%s:%s/udp",frontend, backend)) + portSpecs = append(portSpecs, fmt.Sprintf("%s:%s/udp", frontend, backend)) } } diff --git a/sysinit.go b/sysinit.go index 34f1cbdac..fe741382c 100644 --- a/sysinit.go +++ b/sysinit.go @@ -4,6 +4,7 @@ import ( "flag" "fmt" "github.com/dotcloud/docker/utils" + "io/ioutil" "log" "os" "os/exec" @@ -92,7 +93,8 @@ func SysInit() { var u = flag.String("u", "", "username or uid") var gw = flag.String("g", "", "gateway address") var workdir = flag.String("w", "", "workdir") - + var hostname = flag.String("h", "", "hostname") + var domainname = flag.String("d", "", "domainname") var flEnv ListOpts flag.Var(&flEnv, "e", "Set environment variables") @@ -101,6 +103,7 @@ func SysInit() { cleanupEnv(flEnv) setupNetworking(*gw) setupWorkingDirectory(*workdir) + setupHostname(*hostname, *domainname) changeUser(*u) executeProgram(flag.Arg(0), flag.Args()) } From 4f2e59f94a771c4b60947726815d065ef0ea253a Mon Sep 17 00:00:00 2001 From: Victor Vieux Date: Mon, 9 Sep 2013 18:57:25 +0000 Subject: [PATCH 2/3] bind mount /etc/hosts and /etc/hostname --- builder.go | 27 ++++++++++++++++++++++++++- container.go | 5 ++--- lxc_template.go | 4 ++++ sysinit.go | 5 +---- 4 files changed, 33 insertions(+), 8 deletions(-) diff --git a/builder.go b/builder.go index 9124f76ac..5ccce8293 100644 --- a/builder.go +++ b/builder.go @@ -3,6 +3,7 @@ package docker import ( "fmt" "github.com/dotcloud/docker/utils" + "io/ioutil" "os" "path" "time" @@ -119,7 +120,31 @@ func (builder *Builder) Create(config *Config) (*Container, error) { if err := container.ToDisk(); err != nil { return nil, err } - // Step 3: register the container + + // Step 3: if hostname, build hostname and hosts files + container.HostnamePath = path.Join(container.root, "hostname") + ioutil.WriteFile(container.HostnamePath, []byte(container.Config.Hostname+"\n"), 0644) + + hostsContent := []byte("127.0.0.1\tlocalhost\n" + + "::1\t\tlocalhost ip6-localhost ip6-loopback\n" + + "fe00::0\t\tip6-localnet\n" + + "ff00::0\t\tip6-mcastprefix\n" + + "ff02::1\t\tip6-allnodes\n" + + "ff02::2\t\tip6-allrouters\n") + + container.HostsPath = path.Join(container.root, "hosts") + + if container.Config.Domainname != "" { + hostsContent = append([]byte("127.0.0.1\t"+container.Config.Hostname+"."+container.Config.Domainname+" "+container.Config.Hostname+"\n"+ + "::1\t\t"+container.Config.Hostname+"."+container.Config.Domainname+" "+container.Config.Hostname+"\n"), hostsContent...) + } else { + hostsContent = append([]byte("127.0.0.1\t"+container.Config.Hostname+"\n"+ + "::1\t\t"+container.Config.Hostname+"\n"), hostsContent...) + } + + ioutil.WriteFile(container.HostsPath, hostsContent, 0644) + + // Step 4: register the container if err := builder.runtime.Register(container); err != nil { return nil, err } diff --git a/container.go b/container.go index 488cba322..ecbf8e561 100644 --- a/container.go +++ b/container.go @@ -42,6 +42,8 @@ type Container struct { SysInitPath string ResolvConfPath string + HostnamePath string + HostsPath string cmd *exec.Cmd stdout *utils.WriteBroadcaster @@ -702,9 +704,6 @@ func (container *Container) Start(hostConfig *HostConfig) error { params = append(params, "-e", "TERM=xterm") } - params = append(params, "-h", container.Config.Hostname) - params = append(params, "-d", container.Config.Domainname) - // Setup environment params = append(params, "-e", "HOME=/", diff --git a/lxc_template.go b/lxc_template.go index d357c02b4..701358123 100644 --- a/lxc_template.go +++ b/lxc_template.go @@ -30,6 +30,10 @@ lxc.network.ipv4 = {{.NetworkSettings.IPAddress}}/{{.NetworkSettings.IPPrefixLen {{$ROOTFS := .RootfsPath}} lxc.rootfs = {{$ROOTFS}} +# enable domain name support +lxc.mount.entry = {{.HostnamePath}} {{$ROOTFS}}/etc/hostname none bind,ro 0 0 +lxc.mount.entry = {{.HostsPath}} {{$ROOTFS}}/etc/hosts none bind,ro 0 0 + # use a dedicated pts for the container (and limit the number of pseudo terminal # available) lxc.pts = 1024 diff --git a/sysinit.go b/sysinit.go index fe741382c..34f1cbdac 100644 --- a/sysinit.go +++ b/sysinit.go @@ -4,7 +4,6 @@ import ( "flag" "fmt" "github.com/dotcloud/docker/utils" - "io/ioutil" "log" "os" "os/exec" @@ -93,8 +92,7 @@ func SysInit() { var u = flag.String("u", "", "username or uid") var gw = flag.String("g", "", "gateway address") var workdir = flag.String("w", "", "workdir") - var hostname = flag.String("h", "", "hostname") - var domainname = flag.String("d", "", "domainname") + var flEnv ListOpts flag.Var(&flEnv, "e", "Set environment variables") @@ -103,7 +101,6 @@ func SysInit() { cleanupEnv(flEnv) setupNetworking(*gw) setupWorkingDirectory(*workdir) - setupHostname(*hostname, *domainname) changeUser(*u) executeProgram(flag.Arg(0), flag.Args()) } From 446ca4b57b228a2d030f0c816e08948ff7da1d79 Mon Sep 17 00:00:00 2001 From: Victor Vieux Date: Mon, 9 Sep 2013 19:40:25 +0000 Subject: [PATCH 3/3] fix init layer --- builder.go | 22 ++++++++++++---------- graph.go | 2 ++ 2 files changed, 14 insertions(+), 10 deletions(-) diff --git a/builder.go b/builder.go index 5ccce8293..6e04c8de8 100644 --- a/builder.go +++ b/builder.go @@ -125,21 +125,23 @@ func (builder *Builder) Create(config *Config) (*Container, error) { container.HostnamePath = path.Join(container.root, "hostname") ioutil.WriteFile(container.HostnamePath, []byte(container.Config.Hostname+"\n"), 0644) - hostsContent := []byte("127.0.0.1\tlocalhost\n" + - "::1\t\tlocalhost ip6-localhost ip6-loopback\n" + - "fe00::0\t\tip6-localnet\n" + - "ff00::0\t\tip6-mcastprefix\n" + - "ff02::1\t\tip6-allnodes\n" + - "ff02::2\t\tip6-allrouters\n") + hostsContent := []byte(` +127.0.0.1 localhost +::1 localhost ip6-localhost ip6-loopback +fe00::0 ip6-localnet +ff00::0 ip6-mcastprefix +ff02::1 ip6-allnodes +ff02::2 ip6-allrouters +`) container.HostsPath = path.Join(container.root, "hosts") if container.Config.Domainname != "" { - hostsContent = append([]byte("127.0.0.1\t"+container.Config.Hostname+"."+container.Config.Domainname+" "+container.Config.Hostname+"\n"+ - "::1\t\t"+container.Config.Hostname+"."+container.Config.Domainname+" "+container.Config.Hostname+"\n"), hostsContent...) + hostsContent = append([]byte(fmt.Sprintf("::1\t\t%s.%s %s\n", container.Config.Hostname, container.Config.Domainname, container.Config.Hostname)), hostsContent...) + hostsContent = append([]byte(fmt.Sprintf("127.0.0.1\t%s.%s %s\n", container.Config.Hostname, container.Config.Domainname, container.Config.Hostname)), hostsContent...) } else { - hostsContent = append([]byte("127.0.0.1\t"+container.Config.Hostname+"\n"+ - "::1\t\t"+container.Config.Hostname+"\n"), hostsContent...) + hostsContent = append([]byte(fmt.Sprintf("::1\t\t%s\n", container.Config.Hostname)), hostsContent...) + hostsContent = append([]byte(fmt.Sprintf("127.0.0.1\t%s\n", container.Config.Hostname)), hostsContent...) } ioutil.WriteFile(container.HostsPath, hostsContent, 0644) diff --git a/graph.go b/graph.go index c54725fdb..ffbb3f6a6 100644 --- a/graph.go +++ b/graph.go @@ -202,6 +202,8 @@ func (graph *Graph) getDockerInitLayer() (string, error) { "/sys": "dir", "/.dockerinit": "file", "/etc/resolv.conf": "file", + "/etc/hosts": "file", + "/etc/hostname": "file", // "var/run": "dir", // "var/lock": "dir", } {