controller.go 4.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166
  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/boltdbcachestorage"
  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. })
  88. if err != nil {
  89. return nil, err
  90. }
  91. exec, err := newExecutor(root, opt.NetnsRoot, opt.NetworkController)
  92. if err != nil {
  93. return nil, err
  94. }
  95. differ, ok := sbase.(containerimageexp.Differ)
  96. if !ok {
  97. return nil, errors.Errorf("snapshotter doesn't support differ")
  98. }
  99. exp, err := containerimageexp.New(containerimageexp.Opt{
  100. ImageStore: dist.ImageStore,
  101. ReferenceStore: dist.ReferenceStore,
  102. Differ: differ,
  103. })
  104. if err != nil {
  105. return nil, err
  106. }
  107. cacheStorage, err := boltdbcachestorage.NewStore(filepath.Join(opt.Root, "cache.db"))
  108. if err != nil {
  109. return nil, err
  110. }
  111. wopt := mobyworker.Opt{
  112. ID: "moby",
  113. SessionManager: opt.SessionManager,
  114. MetadataStore: md,
  115. ContentStore: store,
  116. CacheManager: cm,
  117. Snapshotter: snapshotter,
  118. Executor: exec,
  119. ImageSource: src,
  120. DownloadManager: dist.DownloadManager,
  121. V2MetadataService: dist.V2MetadataService,
  122. Exporters: map[string]exporter.Exporter{
  123. "moby": exp,
  124. },
  125. Transport: rt,
  126. }
  127. wc := &worker.Controller{}
  128. w, err := mobyworker.NewWorker(wopt)
  129. if err != nil {
  130. return nil, err
  131. }
  132. wc.Add(w)
  133. frontends := map[string]frontend.Frontend{
  134. "dockerfile.v0": forwarder.NewGatewayForwarder(wc, dockerfile.Build),
  135. "gateway.v0": gateway.NewGatewayFrontend(wc),
  136. }
  137. return control.NewController(control.Opt{
  138. SessionManager: opt.SessionManager,
  139. WorkerController: wc,
  140. Frontends: frontends,
  141. CacheKeyStorage: cacheStorage,
  142. ResolveCacheImporterFunc: registryremotecache.ResolveCacheImporterFunc(opt.SessionManager),
  143. // TODO: set ResolveCacheExporterFunc for exporting cache
  144. })
  145. }