controller.go 4.5 KB

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