github.com/devdivbcp/moby@v17.12.0-ce-rc1.0.20200726071732-2d4bfdc789ad+incompatible/builder/builder-next/controller.go (about) 1 package buildkit 2 3 import ( 4 "net/http" 5 "os" 6 "path/filepath" 7 8 "github.com/containerd/containerd/content/local" 9 "github.com/containerd/containerd/platforms" 10 "github.com/docker/docker/api/types" 11 "github.com/docker/docker/api/types/filters" 12 "github.com/docker/docker/builder/builder-next/adapters/containerimage" 13 "github.com/docker/docker/builder/builder-next/adapters/localinlinecache" 14 "github.com/docker/docker/builder/builder-next/adapters/snapshot" 15 containerimageexp "github.com/docker/docker/builder/builder-next/exporter" 16 "github.com/docker/docker/builder/builder-next/imagerefchecker" 17 mobyworker "github.com/docker/docker/builder/builder-next/worker" 18 "github.com/docker/docker/daemon/config" 19 "github.com/docker/docker/daemon/graphdriver" 20 units "github.com/docker/go-units" 21 "github.com/moby/buildkit/cache" 22 "github.com/moby/buildkit/cache/metadata" 23 "github.com/moby/buildkit/cache/remotecache" 24 inlineremotecache "github.com/moby/buildkit/cache/remotecache/inline" 25 localremotecache "github.com/moby/buildkit/cache/remotecache/local" 26 "github.com/moby/buildkit/client" 27 "github.com/moby/buildkit/control" 28 "github.com/moby/buildkit/frontend" 29 dockerfile "github.com/moby/buildkit/frontend/dockerfile/builder" 30 "github.com/moby/buildkit/frontend/gateway" 31 "github.com/moby/buildkit/frontend/gateway/forwarder" 32 "github.com/moby/buildkit/snapshot/blobmapping" 33 "github.com/moby/buildkit/solver/bboltcachestorage" 34 "github.com/moby/buildkit/util/binfmt_misc" 35 "github.com/moby/buildkit/util/entitlements" 36 "github.com/moby/buildkit/worker" 37 specs "github.com/opencontainers/image-spec/specs-go/v1" 38 "github.com/pkg/errors" 39 ) 40 41 func newController(rt http.RoundTripper, opt Opt) (*control.Controller, error) { 42 if err := os.MkdirAll(opt.Root, 0711); err != nil { 43 return nil, err 44 } 45 46 dist := opt.Dist 47 root := opt.Root 48 49 var driver graphdriver.Driver 50 if ls, ok := dist.LayerStore.(interface { 51 Driver() graphdriver.Driver 52 }); ok { 53 driver = ls.Driver() 54 } else { 55 return nil, errors.Errorf("could not access graphdriver") 56 } 57 58 sbase, err := snapshot.NewSnapshotter(snapshot.Opt{ 59 GraphDriver: driver, 60 LayerStore: dist.LayerStore, 61 Root: root, 62 IdentityMapping: opt.IdentityMapping, 63 }) 64 if err != nil { 65 return nil, err 66 } 67 68 store, err := local.NewStore(filepath.Join(root, "content")) 69 if err != nil { 70 return nil, err 71 } 72 store = &contentStoreNoLabels{store} 73 74 md, err := metadata.NewStore(filepath.Join(root, "metadata.db")) 75 if err != nil { 76 return nil, err 77 } 78 79 snapshotter := blobmapping.NewSnapshotter(blobmapping.Opt{ 80 Content: store, 81 Snapshotter: sbase, 82 MetadataStore: md, 83 }) 84 85 layerGetter, ok := sbase.(imagerefchecker.LayerGetter) 86 if !ok { 87 return nil, errors.Errorf("snapshotter does not implement layergetter") 88 } 89 90 refChecker := imagerefchecker.New(imagerefchecker.Opt{ 91 ImageStore: dist.ImageStore, 92 LayerGetter: layerGetter, 93 }) 94 95 cm, err := cache.NewManager(cache.ManagerOpt{ 96 Snapshotter: snapshotter, 97 MetadataStore: md, 98 PruneRefChecker: refChecker, 99 }) 100 if err != nil { 101 return nil, err 102 } 103 104 src, err := containerimage.NewSource(containerimage.SourceOpt{ 105 CacheAccessor: cm, 106 ContentStore: store, 107 DownloadManager: dist.DownloadManager, 108 MetadataStore: dist.V2MetadataService, 109 ImageStore: dist.ImageStore, 110 ReferenceStore: dist.ReferenceStore, 111 ResolverOpt: opt.ResolverOpt, 112 }) 113 if err != nil { 114 return nil, err 115 } 116 117 dns := getDNSConfig(opt.DNSConfig) 118 119 exec, err := newExecutor(root, opt.DefaultCgroupParent, opt.NetworkController, dns, opt.Rootless, opt.IdentityMapping) 120 if err != nil { 121 return nil, err 122 } 123 124 differ, ok := sbase.(containerimageexp.Differ) 125 if !ok { 126 return nil, errors.Errorf("snapshotter doesn't support differ") 127 } 128 129 exp, err := containerimageexp.New(containerimageexp.Opt{ 130 ImageStore: dist.ImageStore, 131 ReferenceStore: dist.ReferenceStore, 132 Differ: differ, 133 }) 134 if err != nil { 135 return nil, err 136 } 137 138 cacheStorage, err := bboltcachestorage.NewStore(filepath.Join(opt.Root, "cache.db")) 139 if err != nil { 140 return nil, err 141 } 142 143 gcPolicy, err := getGCPolicy(opt.BuilderConfig, root) 144 if err != nil { 145 return nil, errors.Wrap(err, "could not get builder GC policy") 146 } 147 148 layers, ok := sbase.(mobyworker.LayerAccess) 149 if !ok { 150 return nil, errors.Errorf("snapshotter doesn't support differ") 151 } 152 153 p, err := parsePlatforms(binfmt_misc.SupportedPlatforms()) 154 if err != nil { 155 return nil, err 156 } 157 158 wopt := mobyworker.Opt{ 159 ID: "moby", 160 MetadataStore: md, 161 ContentStore: store, 162 CacheManager: cm, 163 GCPolicy: gcPolicy, 164 Snapshotter: snapshotter, 165 Executor: exec, 166 ImageSource: src, 167 DownloadManager: dist.DownloadManager, 168 V2MetadataService: dist.V2MetadataService, 169 Exporter: exp, 170 Transport: rt, 171 Layers: layers, 172 Platforms: p, 173 } 174 175 wc := &worker.Controller{} 176 w, err := mobyworker.NewWorker(wopt) 177 if err != nil { 178 return nil, err 179 } 180 wc.Add(w) 181 182 frontends := map[string]frontend.Frontend{ 183 "dockerfile.v0": forwarder.NewGatewayForwarder(wc, dockerfile.Build), 184 "gateway.v0": gateway.NewGatewayFrontend(wc), 185 } 186 187 return control.NewController(control.Opt{ 188 SessionManager: opt.SessionManager, 189 WorkerController: wc, 190 Frontends: frontends, 191 CacheKeyStorage: cacheStorage, 192 ResolveCacheImporterFuncs: map[string]remotecache.ResolveCacheImporterFunc{ 193 "registry": localinlinecache.ResolveCacheImporterFunc(opt.SessionManager, opt.ResolverOpt, dist.ReferenceStore, dist.ImageStore), 194 "local": localremotecache.ResolveCacheImporterFunc(opt.SessionManager), 195 }, 196 ResolveCacheExporterFuncs: map[string]remotecache.ResolveCacheExporterFunc{ 197 "inline": inlineremotecache.ResolveCacheExporterFunc(), 198 }, 199 Entitlements: getEntitlements(opt.BuilderConfig), 200 }) 201 } 202 203 func getGCPolicy(conf config.BuilderConfig, root string) ([]client.PruneInfo, error) { 204 var gcPolicy []client.PruneInfo 205 if conf.GC.Enabled { 206 var ( 207 defaultKeepStorage int64 208 err error 209 ) 210 211 if conf.GC.DefaultKeepStorage != "" { 212 defaultKeepStorage, err = units.RAMInBytes(conf.GC.DefaultKeepStorage) 213 if err != nil { 214 return nil, errors.Wrapf(err, "could not parse '%s' as Builder.GC.DefaultKeepStorage config", conf.GC.DefaultKeepStorage) 215 } 216 } 217 218 if conf.GC.Policy == nil { 219 gcPolicy = mobyworker.DefaultGCPolicy(root, defaultKeepStorage) 220 } else { 221 gcPolicy = make([]client.PruneInfo, len(conf.GC.Policy)) 222 for i, p := range conf.GC.Policy { 223 b, err := units.RAMInBytes(p.KeepStorage) 224 if err != nil { 225 return nil, err 226 } 227 if b == 0 { 228 b = defaultKeepStorage 229 } 230 gcPolicy[i], err = toBuildkitPruneInfo(types.BuildCachePruneOptions{ 231 All: p.All, 232 KeepStorage: b, 233 Filters: filters.Args(p.Filter), 234 }) 235 if err != nil { 236 return nil, err 237 } 238 } 239 } 240 } 241 return gcPolicy, nil 242 } 243 244 func parsePlatforms(platformsStr []string) ([]specs.Platform, error) { 245 out := make([]specs.Platform, 0, len(platformsStr)) 246 for _, s := range platformsStr { 247 p, err := platforms.Parse(s) 248 if err != nil { 249 return nil, err 250 } 251 out = append(out, platforms.Normalize(p)) 252 } 253 return out, nil 254 } 255 256 func getEntitlements(conf config.BuilderConfig) []string { 257 var ents []string 258 // Incase of no config settings, NetworkHost should be enabled & SecurityInsecure must be disabled. 259 if conf.Entitlements.NetworkHost == nil || *conf.Entitlements.NetworkHost { 260 ents = append(ents, string(entitlements.EntitlementNetworkHost)) 261 } 262 if conf.Entitlements.SecurityInsecure != nil && *conf.Entitlements.SecurityInsecure { 263 ents = append(ents, string(entitlements.EntitlementSecurityInsecure)) 264 } 265 return ents 266 }