lxc_init_linux.go 1.8 KB

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