sysinit.go 2.1 KB

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