sysinit.go 2.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113
  1. package sysinit
  2. import (
  3. "encoding/json"
  4. "flag"
  5. "fmt"
  6. "github.com/dotcloud/docker/execdriver"
  7. _ "github.com/dotcloud/docker/execdriver/lxc"
  8. _ "github.com/dotcloud/docker/execdriver/native"
  9. "io"
  10. "io/ioutil"
  11. "log"
  12. "os"
  13. "strings"
  14. )
  15. // Clear environment pollution introduced by lxc-start
  16. func setupEnv(args *execdriver.InitArgs) {
  17. os.Clearenv()
  18. for _, kv := range args.Env {
  19. parts := strings.SplitN(kv, "=", 2)
  20. if len(parts) == 1 {
  21. parts = append(parts, "")
  22. }
  23. os.Setenv(parts[0], parts[1])
  24. }
  25. }
  26. func executeProgram(args *execdriver.InitArgs) error {
  27. setupEnv(args)
  28. dockerInitFct, err := execdriver.GetInitFunc(args.Driver)
  29. if err != nil {
  30. panic(err)
  31. }
  32. return dockerInitFct(args)
  33. }
  34. // Sys Init code
  35. // This code is run INSIDE the container and is responsible for setting
  36. // up the environment before running the actual process
  37. func SysInit() {
  38. if len(os.Args) <= 1 {
  39. fmt.Println("You should not invoke dockerinit manually")
  40. os.Exit(1)
  41. }
  42. var (
  43. // Get cmdline arguments
  44. user = flag.String("u", "", "username or uid")
  45. gateway = flag.String("g", "", "gateway address")
  46. ip = flag.String("i", "", "ip address")
  47. workDir = flag.String("w", "", "workdir")
  48. privileged = flag.Bool("privileged", false, "privileged mode")
  49. mtu = flag.Int("mtu", 1500, "interface mtu")
  50. driver = flag.String("driver", "", "exec driver")
  51. pipe = flag.Int("pipe", 0, "sync pipe fd")
  52. console = flag.String("console", "", "console (pty slave) path")
  53. logFile = flag.String("log", "", "log file path")
  54. )
  55. flag.Parse()
  56. if err := setupLogging(*logFile); err != nil {
  57. log.Fatalf("setup logging %s", err)
  58. }
  59. // Get env
  60. var env []string
  61. content, err := ioutil.ReadFile(".dockerenv")
  62. if err != nil {
  63. log.Fatalf("Unable to load environment variables: %v", err)
  64. }
  65. if err := json.Unmarshal(content, &env); err != nil {
  66. log.Fatalf("Unable to unmarshal environment variables: %v", err)
  67. }
  68. // Propagate the plugin-specific container env variable
  69. env = append(env, "container="+os.Getenv("container"))
  70. args := &execdriver.InitArgs{
  71. User: *user,
  72. Gateway: *gateway,
  73. Ip: *ip,
  74. WorkDir: *workDir,
  75. Privileged: *privileged,
  76. Env: env,
  77. Args: flag.Args(),
  78. Mtu: *mtu,
  79. Driver: *driver,
  80. Console: *console,
  81. Pipe: *pipe,
  82. }
  83. if err := executeProgram(args); err != nil {
  84. log.Fatal(err)
  85. }
  86. }
  87. func setupLogging(logFile string) (err error) {
  88. var writer io.Writer
  89. switch logFile {
  90. case "stderr":
  91. writer = os.Stderr
  92. case "none", "":
  93. writer = ioutil.Discard
  94. default:
  95. writer, err = os.OpenFile(logFile, os.O_RDWR|os.O_CREATE|os.O_APPEND, 0755)
  96. if err != nil {
  97. return err
  98. }
  99. }
  100. log.SetOutput(writer)
  101. return nil
  102. }