sysinit.go 2.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990
  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/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. }
  33. // Sys Init code
  34. // This code is run INSIDE the container and is responsible for setting
  35. // up the environment before running the actual process
  36. func SysInit() {
  37. if len(os.Args) <= 1 {
  38. fmt.Println("You should not invoke dockerinit manually")
  39. os.Exit(1)
  40. }
  41. var (
  42. // Get cmdline arguments
  43. user = flag.String("u", "", "username or uid")
  44. gateway = flag.String("g", "", "gateway address")
  45. ip = flag.String("i", "", "ip address")
  46. workDir = flag.String("w", "", "workdir")
  47. privileged = flag.Bool("privileged", false, "privileged mode")
  48. mtu = flag.Int("mtu", 1500, "interface mtu")
  49. driver = flag.String("driver", "", "exec driver")
  50. pipe = flag.Int("pipe", 0, "sync pipe fd")
  51. console = flag.String("console", "", "console (pty slave) path")
  52. )
  53. flag.Parse()
  54. // Get env
  55. var env []string
  56. content, err := ioutil.ReadFile(".dockerenv")
  57. if err != nil {
  58. log.Fatalf("Unable to load environment variables: %v", err)
  59. }
  60. if err := json.Unmarshal(content, &env); err != nil {
  61. log.Fatalf("Unable to unmarshal environment variables: %v", err)
  62. }
  63. // Propagate the plugin-specific container env variable
  64. env = append(env, "container="+os.Getenv("container"))
  65. args := &execdriver.InitArgs{
  66. User: *user,
  67. Gateway: *gateway,
  68. Ip: *ip,
  69. WorkDir: *workDir,
  70. Privileged: *privileged,
  71. Env: env,
  72. Args: flag.Args(),
  73. Mtu: *mtu,
  74. Driver: *driver,
  75. Console: *console,
  76. Pipe: *pipe,
  77. }
  78. if err := executeProgram(args); err != nil {
  79. log.Fatal(err)
  80. }
  81. }