lxc_init_linux.go 1.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778
  1. package lxc
  2. import (
  3. "fmt"
  4. "strings"
  5. "syscall"
  6. "github.com/docker/docker/daemon/execdriver"
  7. "github.com/docker/docker/daemon/execdriver/native/template"
  8. "github.com/docker/libcontainer/namespaces"
  9. "github.com/docker/libcontainer/security/capabilities"
  10. "github.com/docker/libcontainer/system"
  11. "github.com/docker/libcontainer/utils"
  12. )
  13. func setHostname(hostname string) error {
  14. return syscall.Sethostname([]byte(hostname))
  15. }
  16. func finalizeNamespace(args *InitArgs) error {
  17. if err := utils.CloseExecFrom(3); err != nil {
  18. return err
  19. }
  20. // We use the native drivers default template so that things like caps are consistent
  21. // across both drivers
  22. container := template.New()
  23. if !args.Privileged {
  24. // drop capabilities in bounding set before changing user
  25. if err := capabilities.DropBoundingSet(container.Capabilities); err != nil {
  26. return fmt.Errorf("drop bounding set %s", err)
  27. }
  28. // preserve existing capabilities while we change users
  29. if err := system.SetKeepCaps(); err != nil {
  30. return fmt.Errorf("set keep caps %s", err)
  31. }
  32. }
  33. if err := namespaces.SetupUser(args.User); err != nil {
  34. return fmt.Errorf("setup user %s", err)
  35. }
  36. if !args.Privileged {
  37. if err := system.ClearKeepCaps(); err != nil {
  38. return fmt.Errorf("clear keep caps %s", err)
  39. }
  40. var (
  41. adds []string
  42. drops []string
  43. )
  44. if args.CapAdd != "" {
  45. adds = strings.Split(args.CapAdd, ":")
  46. }
  47. if args.CapDrop != "" {
  48. drops = strings.Split(args.CapDrop, ":")
  49. }
  50. caps, err := execdriver.TweakCapabilities(container.Capabilities, adds, drops)
  51. if err != nil {
  52. return err
  53. }
  54. // drop all other capabilities
  55. if err := capabilities.DropCapabilities(caps); err != nil {
  56. return fmt.Errorf("drop capabilities %s", err)
  57. }
  58. }
  59. if err := setupWorkingDirectory(args); err != nil {
  60. return err
  61. }
  62. return nil
  63. }