mirror of
				https://gitea.com/Lydanne/buildx.git
				synced 2025-11-04 10:03:42 +08:00 
			
		
		
		
	Merge pull request #1813 from jedevc/oci-export-on-containerd
This commit is contained in:
		@@ -364,7 +364,7 @@ func toRepoOnly(in string) (string, error) {
 | 
				
			|||||||
	return strings.Join(out, ","), nil
 | 
						return strings.Join(out, ","), nil
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
func toSolveOpt(ctx context.Context, node builder.Node, multiDriver bool, opt Options, bopts gateway.BuildOpts, configDir string, pw progress.Writer, dl dockerLoadCallback) (solveOpt *client.SolveOpt, release func(), err error) {
 | 
					func toSolveOpt(ctx context.Context, node builder.Node, multiDriver bool, opt Options, bopts gateway.BuildOpts, configDir string, pw progress.Writer, docker *dockerutil.Client) (solveOpt *client.SolveOpt, release func(), err error) {
 | 
				
			||||||
	nodeDriver := node.Driver
 | 
						nodeDriver := node.Driver
 | 
				
			||||||
	defers := make([]func(), 0, 2)
 | 
						defers := make([]func(), 0, 2)
 | 
				
			||||||
	releaseF := func() {
 | 
						releaseF := func() {
 | 
				
			||||||
@@ -532,14 +532,22 @@ func toSolveOpt(ctx context.Context, node builder.Node, multiDriver bool, opt Op
 | 
				
			|||||||
			return nil, nil, notSupported(nodeDriver, driver.OCIExporter)
 | 
								return nil, nil, notSupported(nodeDriver, driver.OCIExporter)
 | 
				
			||||||
		}
 | 
							}
 | 
				
			||||||
		if e.Type == "docker" {
 | 
							if e.Type == "docker" {
 | 
				
			||||||
			if len(opt.Platforms) > 1 || len(attests) > 0 {
 | 
								features := docker.Features(ctx, e.Attrs["context"])
 | 
				
			||||||
 | 
								if features[dockerutil.OCIImporter] && e.Output == nil {
 | 
				
			||||||
 | 
									// rely on oci importer if available (which supports
 | 
				
			||||||
 | 
									// multi-platform images), otherwise fall back to docker
 | 
				
			||||||
 | 
									opt.Exports[i].Type = "oci"
 | 
				
			||||||
 | 
								} else if len(opt.Platforms) > 1 || len(attests) > 0 {
 | 
				
			||||||
 | 
									if e.Output != nil {
 | 
				
			||||||
 | 
										return nil, nil, errors.Errorf("docker exporter does not support exporting manifest lists, use the oci exporter instead")
 | 
				
			||||||
 | 
									}
 | 
				
			||||||
				return nil, nil, errors.Errorf("docker exporter does not currently support exporting manifest lists")
 | 
									return nil, nil, errors.Errorf("docker exporter does not currently support exporting manifest lists")
 | 
				
			||||||
			}
 | 
								}
 | 
				
			||||||
			if e.Output == nil {
 | 
								if e.Output == nil {
 | 
				
			||||||
				if nodeDriver.IsMobyDriver() {
 | 
									if nodeDriver.IsMobyDriver() {
 | 
				
			||||||
					e.Type = "image"
 | 
										e.Type = "image"
 | 
				
			||||||
				} else {
 | 
									} else {
 | 
				
			||||||
					w, cancel, err := dl(e.Attrs["context"])
 | 
										w, cancel, err := docker.LoadImage(ctx, e.Attrs["context"], pw)
 | 
				
			||||||
					if err != nil {
 | 
										if err != nil {
 | 
				
			||||||
						return nil, nil, err
 | 
											return nil, nil, err
 | 
				
			||||||
					}
 | 
										}
 | 
				
			||||||
@@ -734,9 +742,7 @@ func BuildWithResultHandler(ctx context.Context, nodes []builder.Node, opt map[s
 | 
				
			|||||||
				hasMobyDriver = true
 | 
									hasMobyDriver = true
 | 
				
			||||||
			}
 | 
								}
 | 
				
			||||||
			opt.Platforms = np.platforms
 | 
								opt.Platforms = np.platforms
 | 
				
			||||||
			so, release, err := toSolveOpt(ctx, node, multiDriver, opt, np.bopts, configDir, w, func(name string) (io.WriteCloser, func(), error) {
 | 
								so, release, err := toSolveOpt(ctx, node, multiDriver, opt, np.bopts, configDir, w, docker)
 | 
				
			||||||
				return docker.LoadImage(ctx, name, w)
 | 
					 | 
				
			||||||
			})
 | 
					 | 
				
			||||||
			if err != nil {
 | 
								if err != nil {
 | 
				
			||||||
				return nil, err
 | 
									return nil, err
 | 
				
			||||||
			}
 | 
								}
 | 
				
			||||||
@@ -1555,8 +1561,6 @@ func notSupported(d driver.Driver, f driver.Feature) error {
 | 
				
			|||||||
	return errors.Errorf("%s feature is currently not supported for %s driver. Please switch to a different driver (eg. \"docker buildx create --use\")", f, d.Factory().Name())
 | 
						return errors.Errorf("%s feature is currently not supported for %s driver. Please switch to a different driver (eg. \"docker buildx create --use\")", f, d.Factory().Name())
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
type dockerLoadCallback func(name string) (io.WriteCloser, func(), error)
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
func noDefaultLoad() bool {
 | 
					func noDefaultLoad() bool {
 | 
				
			||||||
	v, ok := os.LookupEnv("BUILDX_NO_DEFAULT_LOAD")
 | 
						v, ok := os.LookupEnv("BUILDX_NO_DEFAULT_LOAD")
 | 
				
			||||||
	if !ok {
 | 
						if !ok {
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -63,6 +63,23 @@ func (c *Client) LoadImage(ctx context.Context, name string, status progress.Wri
 | 
				
			|||||||
	}, nil
 | 
						}, nil
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					func (c *Client) Features(ctx context.Context, name string) map[Feature]bool {
 | 
				
			||||||
 | 
						features := make(map[Feature]bool)
 | 
				
			||||||
 | 
						if dapi, err := c.API(name); err == nil {
 | 
				
			||||||
 | 
							if info, err := dapi.Info(ctx); err == nil {
 | 
				
			||||||
 | 
								for _, v := range info.DriverStatus {
 | 
				
			||||||
 | 
									switch v[0] {
 | 
				
			||||||
 | 
									case "driver-type":
 | 
				
			||||||
 | 
										if v[1] == "io.containerd.snapshotter.v1" {
 | 
				
			||||||
 | 
											features[OCIImporter] = true
 | 
				
			||||||
 | 
										}
 | 
				
			||||||
 | 
									}
 | 
				
			||||||
 | 
								}
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
						return features
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
type waitingWriter struct {
 | 
					type waitingWriter struct {
 | 
				
			||||||
	*io.PipeWriter
 | 
						*io.PipeWriter
 | 
				
			||||||
	f      func()
 | 
						f      func()
 | 
				
			||||||
 
 | 
				
			|||||||
							
								
								
									
										5
									
								
								util/dockerutil/features.go
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										5
									
								
								util/dockerutil/features.go
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,5 @@
 | 
				
			|||||||
 | 
					package dockerutil
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					type Feature string
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					const OCIImporter Feature = "OCI importer"
 | 
				
			||||||
		Reference in New Issue
	
	Block a user