sysinit.go 2.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687
  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. }
  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. )
  51. flag.Parse()
  52. // Get env
  53. var env []string
  54. content, err := ioutil.ReadFile("/.dockerenv")
  55. if err != nil {
  56. log.Fatalf("Unable to load environment variables: %v", err)
  57. }
  58. if err := json.Unmarshal(content, &env); err != nil {
  59. log.Fatalf("Unable to unmarshal environment variables: %v", err)
  60. }
  61. // Propagate the plugin-specific container env variable
  62. env = append(env, "container="+os.Getenv("container"))
  63. args := &execdriver.InitArgs{
  64. User: *user,
  65. Gateway: *gateway,
  66. Ip: *ip,
  67. WorkDir: *workDir,
  68. Privileged: *privileged,
  69. Env: env,
  70. Args: flag.Args(),
  71. Mtu: *mtu,
  72. Driver: *driver,
  73. }
  74. if err := executeProgram(args); err != nil {
  75. log.Fatal(err)
  76. }
  77. }