init.go 1.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960
  1. // +build linux
  2. package native
  3. import (
  4. "encoding/json"
  5. "flag"
  6. "fmt"
  7. "os"
  8. "path/filepath"
  9. "runtime"
  10. "github.com/docker/docker/pkg/reexec"
  11. "github.com/docker/libcontainer"
  12. "github.com/docker/libcontainer/namespaces"
  13. )
  14. func init() {
  15. reexec.Register(DriverName, initializer)
  16. }
  17. func initializer() {
  18. runtime.LockOSThread()
  19. var (
  20. pipe = flag.Int("pipe", 0, "sync pipe fd")
  21. console = flag.String("console", "", "console (pty slave) path")
  22. root = flag.String("root", ".", "root path for configuration files")
  23. )
  24. flag.Parse()
  25. var container *libcontainer.Config
  26. f, err := os.Open(filepath.Join(*root, "container.json"))
  27. if err != nil {
  28. writeError(err)
  29. }
  30. if err := json.NewDecoder(f).Decode(&container); err != nil {
  31. f.Close()
  32. writeError(err)
  33. }
  34. f.Close()
  35. rootfs, err := os.Getwd()
  36. if err != nil {
  37. writeError(err)
  38. }
  39. if err := namespaces.Init(container, rootfs, *console, os.NewFile(uintptr(*pipe), "child"), flag.Args()); err != nil {
  40. writeError(err)
  41. }
  42. panic("Unreachable")
  43. }
  44. func writeError(err error) {
  45. fmt.Fprint(os.Stderr, err)
  46. os.Exit(1)
  47. }