Set hostname and IP address from dockerinit
| ... | ... |
@@ -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 |
| ... | ... |
@@ -6,24 +6,15 @@ import ( |
| 6 | 6 |
) |
| 7 | 7 |
|
| 8 | 8 |
const LxcTemplate = ` |
| 9 |
-# hostname |
|
| 10 |
-{{if .Config.Hostname}}
|
|
| 11 |
-lxc.utsname = {{.Config.Hostname}}
|
|
| 12 |
-{{else}}
|
|
| 13 |
-lxc.utsname = {{.Id}}
|
|
| 14 |
-{{end}}
|
|
| 15 |
- |
|
| 16 | 9 |
{{if .Config.NetworkDisabled}}
|
| 17 | 10 |
# network is disabled (-n=false) |
| 18 | 11 |
lxc.network.type = empty |
| 19 | 12 |
{{else}}
|
| 20 | 13 |
# network configuration |
| 21 | 14 |
lxc.network.type = veth |
| 22 |
-lxc.network.flags = up |
|
| 23 | 15 |
lxc.network.link = {{.NetworkSettings.Bridge}}
|
| 24 | 16 |
lxc.network.name = eth0 |
| 25 | 17 |
lxc.network.mtu = 1500 |
| 26 |
-lxc.network.ipv4 = {{.NetworkSettings.IPAddress}}/{{.NetworkSettings.IPPrefixLen}}
|
|
| 27 | 18 |
{{end}}
|
| 28 | 19 |
|
| 29 | 20 |
# root filesystem |
| ... | ... |
@@ -29,7 +29,6 @@ func TestLXCConfig(t *testing.T) {
|
| 29 | 29 |
container := &Container{
|
| 30 | 30 |
root: root, |
| 31 | 31 |
Config: &Config{
|
| 32 |
- Hostname: "foobar", |
|
| 33 | 32 |
Memory: int64(mem), |
| 34 | 33 |
CpuShares: int64(cpu), |
| 35 | 34 |
NetworkDisabled: true, |
| ... | ... |
@@ -41,7 +40,6 @@ func TestLXCConfig(t *testing.T) {
|
| 41 | 41 |
if err := container.generateLXCConfig(); err != nil {
|
| 42 | 42 |
t.Fatal(err) |
| 43 | 43 |
} |
| 44 |
- grepFile(t, container.lxcConfigPath(), "lxc.utsname = foobar") |
|
| 45 | 44 |
grepFile(t, container.lxcConfigPath(), |
| 46 | 45 |
fmt.Sprintf("lxc.cgroup.memory.limit_in_bytes = %d", mem))
|
| 47 | 46 |
grepFile(t, container.lxcConfigPath(), |
| ... | ... |
@@ -20,25 +20,58 @@ 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 |
| 26 | 27 |
args []string |
| 27 | 28 |
} |
| 28 | 29 |
|
| 29 |
-// Setup networking |
|
| 30 |
-func setupNetworking(args *DockerInitArgs) error {
|
|
| 31 |
- if args.gateway == "" {
|
|
| 30 |
+func setupHostname(args *DockerInitArgs) error {
|
|
| 31 |
+ hostname := getEnv(args, "HOSTNAME") |
|
| 32 |
+ if hostname == "" {
|
|
| 32 | 33 |
return nil |
| 33 | 34 |
} |
| 35 |
+ return syscall.Sethostname([]byte(hostname)) |
|
| 36 |
+} |
|
| 37 |
+ |
|
| 38 |
+// Setup networking |
|
| 39 |
+func setupNetworking(args *DockerInitArgs) error {
|
|
| 40 |
+ if args.ip != "" {
|
|
| 41 |
+ // eth0 |
|
| 42 |
+ iface, err := net.InterfaceByName("eth0")
|
|
| 43 |
+ if err != nil {
|
|
| 44 |
+ return fmt.Errorf("Unable to set up networking: %v", err)
|
|
| 45 |
+ } |
|
| 46 |
+ ip, ipNet, err := net.ParseCIDR(args.ip) |
|
| 47 |
+ if err != nil {
|
|
| 48 |
+ return fmt.Errorf("Unable to set up networking: %v", err)
|
|
| 49 |
+ } |
|
| 50 |
+ if err := netlink.NetworkLinkAddIp(iface, ip, ipNet); err != nil {
|
|
| 51 |
+ return fmt.Errorf("Unable to set up networking: %v", err)
|
|
| 52 |
+ } |
|
| 53 |
+ if err := netlink.NetworkLinkUp(iface); err != nil {
|
|
| 54 |
+ return fmt.Errorf("Unable to set up networking: %v", err)
|
|
| 55 |
+ } |
|
| 34 | 56 |
|
| 35 |
- ip := net.ParseIP(args.gateway) |
|
| 36 |
- if ip == nil {
|
|
| 37 |
- return fmt.Errorf("Unable to set up networking, %s is not a valid IP", args.gateway)
|
|
| 57 |
+ // loopback |
|
| 58 |
+ iface, err = net.InterfaceByName("lo")
|
|
| 59 |
+ if err != nil {
|
|
| 60 |
+ return fmt.Errorf("Unable to set up networking: %v", err)
|
|
| 61 |
+ } |
|
| 62 |
+ if err := netlink.NetworkLinkUp(iface); err != nil {
|
|
| 63 |
+ return fmt.Errorf("Unable to set up networking: %v", err)
|
|
| 64 |
+ } |
|
| 38 | 65 |
} |
| 66 |
+ if args.gateway != "" {
|
|
| 67 |
+ gw := net.ParseIP(args.gateway) |
|
| 68 |
+ if gw == nil {
|
|
| 69 |
+ return fmt.Errorf("Unable to set up networking, %s is not a valid gateway IP", args.gateway)
|
|
| 70 |
+ } |
|
| 39 | 71 |
|
| 40 |
- if err := netlink.AddDefaultGw(ip); err != nil {
|
|
| 41 |
- return fmt.Errorf("Unable to set up networking: %v", err)
|
|
| 72 |
+ if err := netlink.AddDefaultGw(gw); err != nil {
|
|
| 73 |
+ return fmt.Errorf("Unable to set up networking: %v", err)
|
|
| 74 |
+ } |
|
| 42 | 75 |
} |
| 43 | 76 |
|
| 44 | 77 |
return nil |
| ... | ... |
@@ -132,9 +165,23 @@ func setupEnv(args *DockerInitArgs) {
|
| 132 | 132 |
} |
| 133 | 133 |
} |
| 134 | 134 |
|
| 135 |
+func getEnv(args *DockerInitArgs, key string) string {
|
|
| 136 |
+ for _, kv := range args.env {
|
|
| 137 |
+ parts := strings.SplitN(kv, "=", 2) |
|
| 138 |
+ if parts[0] == key && len(parts) == 2 {
|
|
| 139 |
+ return parts[1] |
|
| 140 |
+ } |
|
| 141 |
+ } |
|
| 142 |
+ return "" |
|
| 143 |
+} |
|
| 144 |
+ |
|
| 135 | 145 |
func executeProgram(args *DockerInitArgs) error {
|
| 136 | 146 |
setupEnv(args) |
| 137 | 147 |
|
| 148 |
+ if err := setupHostname(args); err != nil {
|
|
| 149 |
+ return err |
|
| 150 |
+ } |
|
| 151 |
+ |
|
| 138 | 152 |
if err := setupNetworking(args); err != nil {
|
| 139 | 153 |
return err |
| 140 | 154 |
} |
| ... | ... |
@@ -177,6 +224,7 @@ func SysInit() {
|
| 177 | 177 |
// Get cmdline arguments |
| 178 | 178 |
user := flag.String("u", "", "username or uid")
|
| 179 | 179 |
gateway := flag.String("g", "", "gateway address")
|
| 180 |
+ ip := flag.String("i", "", "ip address")
|
|
| 180 | 181 |
workDir := flag.String("w", "", "workdir")
|
| 181 | 182 |
privileged := flag.Bool("privileged", false, "privileged mode")
|
| 182 | 183 |
flag.Parse() |
| ... | ... |
@@ -197,6 +245,7 @@ func SysInit() {
|
| 197 | 197 |
args := &DockerInitArgs{
|
| 198 | 198 |
user: *user, |
| 199 | 199 |
gateway: *gateway, |
| 200 |
+ ip: *ip, |
|
| 200 | 201 |
workDir: *workDir, |
| 201 | 202 |
privileged: *privileged, |
| 202 | 203 |
env: env, |