sysinit.go 2.0 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889
  1. package sysinit
  2. import (
  3. "encoding/json"
  4. "flag"
  5. "fmt"
  6. "github.com/dotcloud/docker/execdriver"
  7. "io/ioutil"
  8. "log"
  9. "os"
  10. "strings"
  11. )
  12. // Clear environment pollution introduced by lxc-start
  13. func setupEnv(args *execdriver.DockerInitArgs) {
  14. os.Clearenv()
  15. for _, kv := range args.Env {
  16. parts := strings.SplitN(kv, "=", 2)
  17. if len(parts) == 1 {
  18. parts = append(parts, "")
  19. }
  20. os.Setenv(parts[0], parts[1])
  21. }
  22. }
  23. func executeProgram(args *execdriver.DockerInitArgs) error {
  24. setupEnv(args)
  25. dockerInitFct, err := execdriver.GetDockerInitFct(args.Driver)
  26. if err != nil {
  27. panic(err)
  28. }
  29. return dockerInitFct(args)
  30. if args.Driver == "lxc" {
  31. // Will never reach
  32. } else if args.Driver == "chroot" {
  33. }
  34. return nil
  35. }
  36. // Sys Init code
  37. // This code is run INSIDE the container and is responsible for setting
  38. // up the environment before running the actual process
  39. func SysInit() {
  40. if len(os.Args) <= 1 {
  41. fmt.Println("You should not invoke dockerinit manually")
  42. os.Exit(1)
  43. }
  44. // Get cmdline arguments
  45. user := flag.String("u", "", "username or uid")
  46. gateway := flag.String("g", "", "gateway address")
  47. ip := flag.String("i", "", "ip address")
  48. workDir := flag.String("w", "", "workdir")
  49. privileged := flag.Bool("privileged", false, "privileged mode")
  50. mtu := flag.Int("mtu", 1500, "interface mtu")
  51. driver := flag.String("driver", "", "exec driver")
  52. flag.Parse()
  53. // Get env
  54. var env []string
  55. content, err := ioutil.ReadFile("/.dockerenv")
  56. if err != nil {
  57. log.Fatalf("Unable to load environment variables: %v", err)
  58. }
  59. if err := json.Unmarshal(content, &env); err != nil {
  60. log.Fatalf("Unable to unmarshal environment variables: %v", err)
  61. }
  62. // Propagate the plugin-specific container env variable
  63. env = append(env, "container="+os.Getenv("container"))
  64. args := &execdriver.DockerInitArgs{
  65. User: *user,
  66. Gateway: *gateway,
  67. Ip: *ip,
  68. WorkDir: *workDir,
  69. Privileged: *privileged,
  70. Env: env,
  71. Args: flag.Args(),
  72. Mtu: *mtu,
  73. Driver: *driver,
  74. }
  75. if err := executeProgram(args); err != nil {
  76. log.Fatal(err)
  77. }
  78. }