executor_unix.go 2.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112
  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 newExecutor(root string, net libnetwork.NetworkController) (executor.Executor, error) {
  17. // FIXME: fix bridge networking
  18. _ = bridgeProvider{}
  19. return runcexecutor.New(runcexecutor.Opt{
  20. Root: filepath.Join(root, "executor"),
  21. CommandCandidates: []string{"docker-runc", "runc"},
  22. }, nil)
  23. }
  24. type bridgeProvider struct {
  25. libnetwork.NetworkController
  26. }
  27. func (p *bridgeProvider) NewInterface() (network.Interface, error) {
  28. n, err := p.NetworkByName(networkName)
  29. if err != nil {
  30. return nil, err
  31. }
  32. iface := &lnInterface{ready: make(chan struct{})}
  33. iface.Once.Do(func() {
  34. go iface.init(p.NetworkController, n)
  35. })
  36. return iface, nil
  37. }
  38. func (p *bridgeProvider) Release(iface network.Interface) error {
  39. go func() {
  40. if err := p.release(iface); err != nil {
  41. logrus.Errorf("%s", err)
  42. }
  43. }()
  44. return nil
  45. }
  46. func (p *bridgeProvider) release(iface network.Interface) error {
  47. li, ok := iface.(*lnInterface)
  48. if !ok {
  49. return errors.Errorf("invalid interface %T", iface)
  50. }
  51. err := li.sbx.Delete()
  52. if err1 := li.ep.Delete(true); err1 != nil && err == nil {
  53. err = err1
  54. }
  55. return err
  56. }
  57. type lnInterface struct {
  58. ep libnetwork.Endpoint
  59. sbx libnetwork.Sandbox
  60. sync.Once
  61. err error
  62. ready chan struct{}
  63. }
  64. func (iface *lnInterface) init(c libnetwork.NetworkController, n libnetwork.Network) {
  65. defer close(iface.ready)
  66. id := identity.NewID()
  67. ep, err := n.CreateEndpoint(id)
  68. if err != nil {
  69. iface.err = err
  70. return
  71. }
  72. sbx, err := c.NewSandbox(id)
  73. if err != nil {
  74. iface.err = err
  75. return
  76. }
  77. if err := ep.Join(sbx); err != nil {
  78. iface.err = err
  79. return
  80. }
  81. iface.sbx = sbx
  82. iface.ep = ep
  83. }
  84. func (iface *lnInterface) Set(pid int) error {
  85. <-iface.ready
  86. if iface.err != nil {
  87. return iface.err
  88. }
  89. return iface.sbx.SetKey(fmt.Sprintf("/proc/%d/ns/net", pid))
  90. }
  91. func (iface *lnInterface) Remove(pid int) error {
  92. return nil
  93. }