|
@@ -20,25 +20,58 @@ import (
|
|
type DockerInitArgs struct {
|
|
type DockerInitArgs struct {
|
|
user string
|
|
user string
|
|
gateway string
|
|
gateway string
|
|
|
|
+ ip string
|
|
workDir string
|
|
workDir string
|
|
privileged bool
|
|
privileged bool
|
|
env []string
|
|
env []string
|
|
args []string
|
|
args []string
|
|
}
|
|
}
|
|
|
|
|
|
-// Setup networking
|
|
|
|
-func setupNetworking(args *DockerInitArgs) error {
|
|
|
|
- if args.gateway == "" {
|
|
|
|
|
|
+func setupHostname(args *DockerInitArgs) error {
|
|
|
|
+ hostname := getEnv(args, "HOSTNAME")
|
|
|
|
+ if hostname == "" {
|
|
return nil
|
|
return nil
|
|
}
|
|
}
|
|
|
|
+ return syscall.Sethostname([]byte(hostname))
|
|
|
|
+}
|
|
|
|
+
|
|
|
|
+// Setup networking
|
|
|
|
+func setupNetworking(args *DockerInitArgs) error {
|
|
|
|
+ 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
|
|
return nil
|
|
@@ -132,9 +165,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 {
|
|
func executeProgram(args *DockerInitArgs) error {
|
|
setupEnv(args)
|
|
setupEnv(args)
|
|
|
|
|
|
|
|
+ if err := setupHostname(args); err != nil {
|
|
|
|
+ return err
|
|
|
|
+ }
|
|
|
|
+
|
|
if err := setupNetworking(args); err != nil {
|
|
if err := setupNetworking(args); err != nil {
|
|
return err
|
|
return err
|
|
}
|
|
}
|
|
@@ -177,6 +224,7 @@ func SysInit() {
|
|
// Get cmdline arguments
|
|
// Get cmdline arguments
|
|
user := flag.String("u", "", "username or uid")
|
|
user := flag.String("u", "", "username or uid")
|
|
gateway := flag.String("g", "", "gateway address")
|
|
gateway := flag.String("g", "", "gateway address")
|
|
|
|
+ ip := flag.String("i", "", "ip address")
|
|
workDir := flag.String("w", "", "workdir")
|
|
workDir := flag.String("w", "", "workdir")
|
|
privileged := flag.Bool("privileged", false, "privileged mode")
|
|
privileged := flag.Bool("privileged", false, "privileged mode")
|
|
flag.Parse()
|
|
flag.Parse()
|
|
@@ -197,6 +245,7 @@ func SysInit() {
|
|
args := &DockerInitArgs{
|
|
args := &DockerInitArgs{
|
|
user: *user,
|
|
user: *user,
|
|
gateway: *gateway,
|
|
gateway: *gateway,
|
|
|
|
+ ip: *ip,
|
|
workDir: *workDir,
|
|
workDir: *workDir,
|
|
privileged: *privileged,
|
|
privileged: *privileged,
|
|
env: env,
|
|
env: env,
|