58a22942 |
package docker
import ( |
6de3e8a2 |
"flag" |
58a22942 |
"fmt"
"log"
"os"
"os/exec" |
6de3e8a2 |
"os/user"
"strconv" |
f7eaaa3a |
"strings" |
58a22942 |
"syscall"
)
|
b9b66d0e |
// Setup networking
func setupNetworking(gw string) {
if gw == "" {
return
} |
5e1a975b |
if _, err := ip("route", "add", "default", "via", gw); err != nil { |
b9b66d0e |
log.Fatalf("Unable to set up networking: %v", err)
}
}
|
6de3e8a2 |
// Takes care of dropping privileges to the desired user
func changeUser(u string) {
if u == "" {
return
}
userent, err := user.LookupId(u)
if err != nil {
userent, err = user.Lookup(u)
}
if err != nil {
log.Fatalf("Unable to find user %v: %v", u, err)
}
uid, err := strconv.Atoi(userent.Uid)
if err != nil {
log.Fatalf("Invalid uid: %v", userent.Uid)
}
gid, err := strconv.Atoi(userent.Gid)
if err != nil {
log.Fatalf("Invalid gid: %v", userent.Gid)
}
if err := syscall.Setgid(gid); err != nil {
log.Fatalf("setgid failed: %v", err)
}
if err := syscall.Setuid(uid); err != nil {
log.Fatalf("setuid failed: %v", err)
}
}
|
f7eaaa3a |
// Clear environment pollution introduced by lxc-start |
7b0e96f1 |
func cleanupEnv(env ListOpts) { |
f7eaaa3a |
os.Clearenv()
for _, kv := range env {
parts := strings.SplitN(kv, "=", 2)
if len(parts) == 1 {
parts = append(parts, "")
}
if parts[0] == "container" {
continue
}
os.Setenv(parts[0], parts[1])
}
}
|
6de3e8a2 |
func executeProgram(name string, args []string) {
path, err := exec.LookPath(name)
if err != nil {
log.Printf("Unable to locate %v", name)
os.Exit(127)
}
if err := syscall.Exec(path, args, os.Environ()); err != nil {
panic(err)
}
}
|
58a22942 |
// Sys Init code
// This code is run INSIDE the container and is responsible for setting
// up the environment before running the actual process
func SysInit() {
if len(os.Args) <= 1 {
fmt.Println("You should not invoke docker-init manually")
os.Exit(1)
} |
6de3e8a2 |
var u = flag.String("u", "", "username or uid") |
b9b66d0e |
var gw = flag.String("g", "", "gateway address") |
58a22942 |
|
7b0e96f1 |
var flEnv ListOpts
flag.Var(&flEnv, "e", "Set environment variables")
|
6de3e8a2 |
flag.Parse() |
b9b66d0e |
|
7b0e96f1 |
cleanupEnv(flEnv) |
b9b66d0e |
setupNetworking(*gw) |
6de3e8a2 |
changeUser(*u)
executeProgram(flag.Arg(0), flag.Args()) |
58a22942 |
} |