controller.go 3.9 KB

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