controller.go 4.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154
  1. package buildkit
  2. import (
  3. "net/http"
  4. "os"
  5. "path/filepath"
  6. "github.com/containerd/containerd/content/local"
  7. "github.com/docker/docker/builder/builder-next/adapters/containerimage"
  8. "github.com/docker/docker/builder/builder-next/adapters/snapshot"
  9. containerimageexp "github.com/docker/docker/builder/builder-next/exporter"
  10. mobyworker "github.com/docker/docker/builder/builder-next/worker"
  11. "github.com/docker/docker/daemon/graphdriver"
  12. "github.com/moby/buildkit/cache"
  13. "github.com/moby/buildkit/cache/metadata"
  14. registryremotecache "github.com/moby/buildkit/cache/remotecache/registry"
  15. "github.com/moby/buildkit/control"
  16. "github.com/moby/buildkit/exporter"
  17. "github.com/moby/buildkit/frontend"
  18. dockerfile "github.com/moby/buildkit/frontend/dockerfile/builder"
  19. "github.com/moby/buildkit/frontend/gateway"
  20. "github.com/moby/buildkit/frontend/gateway/forwarder"
  21. "github.com/moby/buildkit/snapshot/blobmapping"
  22. "github.com/moby/buildkit/solver/boltdbcachestorage"
  23. "github.com/moby/buildkit/worker"
  24. "github.com/pkg/errors"
  25. )
  26. func newController(rt http.RoundTripper, opt Opt) (*control.Controller, error) {
  27. if err := os.MkdirAll(opt.Root, 0700); err != nil {
  28. return nil, err
  29. }
  30. dist := opt.Dist
  31. root := opt.Root
  32. var driver graphdriver.Driver
  33. if ls, ok := dist.LayerStore.(interface {
  34. Driver() graphdriver.Driver
  35. }); ok {
  36. driver = ls.Driver()
  37. } else {
  38. return nil, errors.Errorf("could not access graphdriver")
  39. }
  40. sbase, err := snapshot.NewSnapshotter(snapshot.Opt{
  41. GraphDriver: driver,
  42. LayerStore: dist.LayerStore,
  43. Root: root,
  44. })
  45. if err != nil {
  46. return nil, err
  47. }
  48. store, err := local.NewStore(filepath.Join(root, "content"))
  49. if err != nil {
  50. return nil, err
  51. }
  52. store = &contentStoreNoLabels{store}
  53. md, err := metadata.NewStore(filepath.Join(root, "metadata.db"))
  54. if err != nil {
  55. return nil, err
  56. }
  57. snapshotter := blobmapping.NewSnapshotter(blobmapping.Opt{
  58. Content: store,
  59. Snapshotter: sbase,
  60. MetadataStore: md,
  61. })
  62. cm, err := cache.NewManager(cache.ManagerOpt{
  63. Snapshotter: snapshotter,
  64. MetadataStore: md,
  65. })
  66. if err != nil {
  67. return nil, err
  68. }
  69. src, err := containerimage.NewSource(containerimage.SourceOpt{
  70. SessionManager: opt.SessionManager,
  71. CacheAccessor: cm,
  72. ContentStore: store,
  73. DownloadManager: dist.DownloadManager,
  74. MetadataStore: dist.V2MetadataService,
  75. ImageStore: dist.ImageStore,
  76. ReferenceStore: dist.ReferenceStore,
  77. })
  78. if err != nil {
  79. return nil, err
  80. }
  81. exec, err := newExecutor(root)
  82. if err != nil {
  83. return nil, err
  84. }
  85. differ, ok := sbase.(containerimageexp.Differ)
  86. if !ok {
  87. return nil, errors.Errorf("snapshotter doesn't support differ")
  88. }
  89. exp, err := containerimageexp.New(containerimageexp.Opt{
  90. ImageStore: dist.ImageStore,
  91. ReferenceStore: dist.ReferenceStore,
  92. Differ: differ,
  93. })
  94. if err != nil {
  95. return nil, err
  96. }
  97. cacheStorage, err := boltdbcachestorage.NewStore(filepath.Join(opt.Root, "cache.db"))
  98. if err != nil {
  99. return nil, err
  100. }
  101. wopt := mobyworker.Opt{
  102. ID: "moby",
  103. SessionManager: opt.SessionManager,
  104. MetadataStore: md,
  105. ContentStore: store,
  106. CacheManager: cm,
  107. Snapshotter: snapshotter,
  108. Executor: exec,
  109. ImageSource: src,
  110. DownloadManager: dist.DownloadManager,
  111. V2MetadataService: dist.V2MetadataService,
  112. Exporters: map[string]exporter.Exporter{
  113. "moby": exp,
  114. },
  115. Transport: rt,
  116. }
  117. wc := &worker.Controller{}
  118. w, err := mobyworker.NewWorker(wopt)
  119. if err != nil {
  120. return nil, err
  121. }
  122. wc.Add(w)
  123. frontends := map[string]frontend.Frontend{
  124. "dockerfile.v0": forwarder.NewGatewayForwarder(wc, dockerfile.Build),
  125. "gateway.v0": gateway.NewGatewayFrontend(wc),
  126. }
  127. return control.NewController(control.Opt{
  128. SessionManager: opt.SessionManager,
  129. WorkerController: wc,
  130. Frontends: frontends,
  131. CacheKeyStorage: cacheStorage,
  132. ResolveCacheImporterFunc: registryremotecache.ResolveCacheImporterFunc(opt.SessionManager),
  133. // TODO: set ResolveCacheExporterFunc for exporting cache
  134. })
  135. }