init.go 1.2 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465
  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/reexec"
  11. "github.com/docker/libcontainer"
  12. "github.com/docker/libcontainer/namespaces"
  13. "github.com/docker/libcontainer/syncpipe"
  14. )
  15. func init() {
  16. reexec.Register(DriverName, initializer)
  17. }
  18. func initializer() {
  19. runtime.LockOSThread()
  20. var (
  21. pipe = flag.Int("pipe", 0, "sync pipe fd")
  22. console = flag.String("console", "", "console (pty slave) path")
  23. root = flag.String("root", ".", "root path for configuration files")
  24. )
  25. flag.Parse()
  26. var container *libcontainer.Config
  27. f, err := os.Open(filepath.Join(*root, "container.json"))
  28. if err != nil {
  29. writeError(err)
  30. }
  31. if err := json.NewDecoder(f).Decode(&container); err != nil {
  32. f.Close()
  33. writeError(err)
  34. }
  35. f.Close()
  36. rootfs, err := os.Getwd()
  37. if err != nil {
  38. writeError(err)
  39. }
  40. syncPipe, err := syncpipe.NewSyncPipeFromFd(0, uintptr(*pipe))
  41. if err != nil {
  42. writeError(err)
  43. }
  44. if err := namespaces.Init(container, rootfs, *console, syncPipe, flag.Args()); err != nil {
  45. writeError(err)
  46. }
  47. panic("Unreachable")
  48. }
  49. func writeError(err error) {
  50. fmt.Sprint(os.Stderr, err)
  51. }