driver.go 1.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990
  1. package chroot
  2. import (
  3. "github.com/dotcloud/docker/execdriver"
  4. "github.com/dotcloud/docker/mount"
  5. "os"
  6. "os/exec"
  7. )
  8. const (
  9. DriverName = "chroot"
  10. Version = "0.1"
  11. )
  12. func init() {
  13. execdriver.RegisterDockerInitFct(DriverName, func(args *execdriver.DockerInitArgs) error {
  14. if err := mount.ForceMount("proc", "proc", "proc", ""); err != nil {
  15. return err
  16. }
  17. defer mount.ForceUnmount("proc")
  18. cmd := exec.Command(args.Args[0], args.Args[1:]...)
  19. cmd.Stderr = os.Stderr
  20. cmd.Stdout = os.Stdout
  21. cmd.Stdin = os.Stdin
  22. return cmd.Run()
  23. })
  24. }
  25. type driver struct {
  26. }
  27. func NewDriver() (*driver, error) {
  28. return &driver{}, nil
  29. }
  30. func (d *driver) Run(c *execdriver.Process, startCallback execdriver.StartCallback) (int, error) {
  31. params := []string{
  32. "chroot",
  33. c.Rootfs,
  34. "/.dockerinit",
  35. "-driver",
  36. d.Name(),
  37. }
  38. params = append(params, c.Entrypoint)
  39. params = append(params, c.Arguments...)
  40. var (
  41. name = params[0]
  42. arg = params[1:]
  43. )
  44. aname, err := exec.LookPath(name)
  45. if err != nil {
  46. aname = name
  47. }
  48. c.Path = aname
  49. c.Args = append([]string{name}, arg...)
  50. if err := c.Start(); err != nil {
  51. return -1, err
  52. }
  53. if startCallback != nil {
  54. startCallback(c)
  55. }
  56. err = c.Wait()
  57. return c.GetExitCode(), err
  58. }
  59. func (d *driver) Kill(p *execdriver.Process, sig int) error {
  60. return p.Process.Kill()
  61. }
  62. func (d *driver) Wait(id string) error {
  63. panic("Not Implemented")
  64. }
  65. func (d *driver) Info(id string) execdriver.Info {
  66. panic("Not implemented")
  67. }
  68. func (d *driver) Name() string {
  69. return DriverName
  70. }
  71. func (d *driver) Version() string {
  72. return Version
  73. }