executor_unix.go 2.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115
  1. // +build !windows
  2. package buildkit
  3. import (
  4. "fmt"
  5. "path/filepath"
  6. "sync"
  7. "github.com/docker/libnetwork"
  8. "github.com/moby/buildkit/executor"
  9. "github.com/moby/buildkit/executor/runcexecutor"
  10. "github.com/moby/buildkit/identity"
  11. "github.com/moby/buildkit/util/network"
  12. "github.com/pkg/errors"
  13. "github.com/sirupsen/logrus"
  14. )
  15. const networkName = "bridge"
  16. func init() {
  17. // FIXME: https://github.com/moby/moby/issues/37676
  18. runcexecutor.DisableSubReaper()
  19. }
  20. func newExecutor(root string, net libnetwork.NetworkController) (executor.Executor, error) {
  21. return runcexecutor.New(runcexecutor.Opt{
  22. Root: filepath.Join(root, "executor"),
  23. CommandCandidates: []string{"docker-runc", "runc"},
  24. }, &bridgeProvider{NetworkController: net})
  25. }
  26. type bridgeProvider struct {
  27. libnetwork.NetworkController
  28. }
  29. func (p *bridgeProvider) NewInterface() (network.Interface, error) {
  30. n, err := p.NetworkByName(networkName)
  31. if err != nil {
  32. return nil, err
  33. }
  34. iface := &lnInterface{ready: make(chan struct{})}
  35. iface.Once.Do(func() {
  36. go iface.init(p.NetworkController, n)
  37. })
  38. return iface, nil
  39. }
  40. func (p *bridgeProvider) Release(iface network.Interface) error {
  41. go func() {
  42. if err := p.release(iface); err != nil {
  43. logrus.Errorf("%s", err)
  44. }
  45. }()
  46. return nil
  47. }
  48. func (p *bridgeProvider) release(iface network.Interface) error {
  49. li, ok := iface.(*lnInterface)
  50. if !ok {
  51. return errors.Errorf("invalid interface %T", iface)
  52. }
  53. err := li.sbx.Delete()
  54. if err1 := li.ep.Delete(true); err1 != nil && err == nil {
  55. err = err1
  56. }
  57. return err
  58. }
  59. type lnInterface struct {
  60. ep libnetwork.Endpoint
  61. sbx libnetwork.Sandbox
  62. sync.Once
  63. err error
  64. ready chan struct{}
  65. }
  66. func (iface *lnInterface) init(c libnetwork.NetworkController, n libnetwork.Network) {
  67. defer close(iface.ready)
  68. id := identity.NewID()
  69. ep, err := n.CreateEndpoint(id)
  70. if err != nil {
  71. iface.err = err
  72. return
  73. }
  74. sbx, err := c.NewSandbox(id)
  75. if err != nil {
  76. iface.err = err
  77. return
  78. }
  79. if err := ep.Join(sbx); err != nil {
  80. iface.err = err
  81. return
  82. }
  83. iface.sbx = sbx
  84. iface.ep = ep
  85. }
  86. func (iface *lnInterface) Set(pid int) error {
  87. <-iface.ready
  88. if iface.err != nil {
  89. return iface.err
  90. }
  91. return iface.sbx.SetKey(fmt.Sprintf("/proc/%d/ns/net", pid))
  92. }
  93. func (iface *lnInterface) Remove(pid int) error {
  94. return nil
  95. }