mirror of
				https://gitea.com/Lydanne/buildx.git
				synced 2025-10-31 08:03:43 +08:00 
			
		
		
		
	Merge pull request #860 from tonistiigi/no-cache-filter
build: add no-cache-filter
This commit is contained in:
		
							
								
								
									
										23
									
								
								bake/bake.go
									
									
									
									
									
								
							
							
						
						
									
										23
									
								
								bake/bake.go
									
									
									
									
									
								
							| @@ -524,7 +524,7 @@ type Target struct { | ||||
| 	Pull             *bool             `json:"pull,omitempty" hcl:"pull,optional"` | ||||
| 	NoCache          *bool             `json:"no-cache,omitempty" hcl:"no-cache,optional"` | ||||
| 	NetworkMode      *string           `json:"-" hcl:"-"` | ||||
|  | ||||
| 	NoCacheFilter    []string          `json:"no-cache-filter,omitempty" hcl:"no-cache-filter,optional"` | ||||
| 	// IMPORTANT: if you add more fields here, do not forget to update newOverrides and README. | ||||
| } | ||||
|  | ||||
| @@ -536,6 +536,7 @@ func (t *Target) normalize() { | ||||
| 	t.CacheFrom = removeDupes(t.CacheFrom) | ||||
| 	t.CacheTo = removeDupes(t.CacheTo) | ||||
| 	t.Outputs = removeDupes(t.Outputs) | ||||
| 	t.NoCacheFilter = removeDupes(t.NoCacheFilter) | ||||
|  | ||||
| 	for k, v := range t.Contexts { | ||||
| 		if v == "" { | ||||
| @@ -608,6 +609,9 @@ func (t *Target) Merge(t2 *Target) { | ||||
| 	if t2.NetworkMode != nil { | ||||
| 		t.NetworkMode = t2.NetworkMode | ||||
| 	} | ||||
| 	if t2.NoCacheFilter != nil { // merge | ||||
| 		t.NoCacheFilter = append(t.NoCacheFilter, t2.NoCacheFilter...) | ||||
| 	} | ||||
| 	t.Inherits = append(t.Inherits, t2.Inherits...) | ||||
| } | ||||
|  | ||||
| @@ -666,6 +670,8 @@ func (t *Target) AddOverrides(overrides map[string]Override) error { | ||||
| 				return errors.Errorf("invalid value %s for boolean key no-cache", value) | ||||
| 			} | ||||
| 			t.NoCache = &noCache | ||||
| 		case "no-cache-filter": | ||||
| 			t.NoCacheFilter = o.ArrValue | ||||
| 		case "pull": | ||||
| 			pull, err := strconv.ParseBool(value) | ||||
| 			if err != nil { | ||||
| @@ -776,13 +782,14 @@ func toBuildOpt(t *Target, inp *Input) (*build.Options, error) { | ||||
| 	t.Context = &bi.ContextPath | ||||
|  | ||||
| 	bo := &build.Options{ | ||||
| 		Inputs:      bi, | ||||
| 		Tags:        t.Tags, | ||||
| 		BuildArgs:   t.Args, | ||||
| 		Labels:      t.Labels, | ||||
| 		NoCache:     noCache, | ||||
| 		Pull:        pull, | ||||
| 		NetworkMode: networkMode, | ||||
| 		Inputs:        bi, | ||||
| 		Tags:          t.Tags, | ||||
| 		BuildArgs:     t.Args, | ||||
| 		Labels:        t.Labels, | ||||
| 		NoCache:       noCache, | ||||
| 		NoCacheFilter: t.NoCacheFilter, | ||||
| 		Pull:          pull, | ||||
| 		NetworkMode:   networkMode, | ||||
| 	} | ||||
|  | ||||
| 	platforms, err := platformutil.Parse(t.Platforms) | ||||
|   | ||||
| @@ -194,6 +194,14 @@ func (t *Target) composeExtTarget(exts map[string]interface{}) error { | ||||
| 				if res, ok := val.(bool); ok { | ||||
| 					t.NoCache = &res | ||||
| 				} | ||||
| 			case "no-cache-filter": | ||||
| 				if res, k := val.(string); k { | ||||
| 					t.NoCacheFilter = append(t.NoCacheFilter, res) | ||||
| 				} else { | ||||
| 					for _, res := range val.([]interface{}) { | ||||
| 						t.NoCacheFilter = append(t.NoCacheFilter, res.(string)) | ||||
| 					} | ||||
| 				} | ||||
| 			default: | ||||
| 				return fmt.Errorf("compose file invalid: unkwown %s field for x-bake", key) | ||||
| 			} | ||||
|   | ||||
| @@ -56,24 +56,25 @@ var ( | ||||
| type Options struct { | ||||
| 	Inputs Inputs | ||||
|  | ||||
| 	Allow        []entitlements.Entitlement | ||||
| 	BuildArgs    map[string]string | ||||
| 	CacheFrom    []client.CacheOptionsEntry | ||||
| 	CacheTo      []client.CacheOptionsEntry | ||||
| 	CgroupParent string | ||||
| 	Exports      []client.ExportEntry | ||||
| 	ExtraHosts   []string | ||||
| 	ImageIDFile  string | ||||
| 	Labels       map[string]string | ||||
| 	NetworkMode  string | ||||
| 	NoCache      bool | ||||
| 	Platforms    []specs.Platform | ||||
| 	Pull         bool | ||||
| 	Session      []session.Attachable | ||||
| 	ShmSize      opts.MemBytes | ||||
| 	Tags         []string | ||||
| 	Target       string | ||||
| 	Ulimits      *opts.UlimitOpt | ||||
| 	Allow         []entitlements.Entitlement | ||||
| 	BuildArgs     map[string]string | ||||
| 	CacheFrom     []client.CacheOptionsEntry | ||||
| 	CacheTo       []client.CacheOptionsEntry | ||||
| 	CgroupParent  string | ||||
| 	Exports       []client.ExportEntry | ||||
| 	ExtraHosts    []string | ||||
| 	ImageIDFile   string | ||||
| 	Labels        map[string]string | ||||
| 	NetworkMode   string | ||||
| 	NoCache       bool | ||||
| 	NoCacheFilter []string | ||||
| 	Platforms     []specs.Platform | ||||
| 	Pull          bool | ||||
| 	Session       []session.Attachable | ||||
| 	ShmSize       opts.MemBytes | ||||
| 	Tags          []string | ||||
| 	Target        string | ||||
| 	Ulimits       *opts.UlimitOpt | ||||
| } | ||||
|  | ||||
| type Inputs struct { | ||||
| @@ -527,6 +528,9 @@ func toSolveOpt(ctx context.Context, d driver.Driver, multiDriver bool, opt Opti | ||||
| 	if opt.Target != "" { | ||||
| 		so.FrontendAttrs["target"] = opt.Target | ||||
| 	} | ||||
| 	if len(opt.NoCacheFilter) > 0 { | ||||
| 		so.FrontendAttrs["no-cache"] = strings.Join(opt.NoCacheFilter, ",") | ||||
| 	} | ||||
| 	if opt.NoCache { | ||||
| 		so.FrontendAttrs["no-cache"] = "" | ||||
| 	} | ||||
|   | ||||
| @@ -43,25 +43,26 @@ type buildOptions struct { | ||||
| 	contextPath    string | ||||
| 	dockerfileName string | ||||
|  | ||||
| 	allow        []string | ||||
| 	buildArgs    []string | ||||
| 	cacheFrom    []string | ||||
| 	cacheTo      []string | ||||
| 	cgroupParent string | ||||
| 	contexts     []string | ||||
| 	extraHosts   []string | ||||
| 	imageIDFile  string | ||||
| 	labels       []string | ||||
| 	networkMode  string | ||||
| 	outputs      []string | ||||
| 	platforms    []string | ||||
| 	quiet        bool | ||||
| 	secrets      []string | ||||
| 	shmSize      dockeropts.MemBytes | ||||
| 	ssh          []string | ||||
| 	tags         []string | ||||
| 	target       string | ||||
| 	ulimits      *dockeropts.UlimitOpt | ||||
| 	allow         []string | ||||
| 	buildArgs     []string | ||||
| 	cacheFrom     []string | ||||
| 	cacheTo       []string | ||||
| 	cgroupParent  string | ||||
| 	contexts      []string | ||||
| 	extraHosts    []string | ||||
| 	imageIDFile   string | ||||
| 	labels        []string | ||||
| 	networkMode   string | ||||
| 	noCacheFilter []string | ||||
| 	outputs       []string | ||||
| 	platforms     []string | ||||
| 	quiet         bool | ||||
| 	secrets       []string | ||||
| 	shmSize       dockeropts.MemBytes | ||||
| 	ssh           []string | ||||
| 	tags          []string | ||||
| 	target        string | ||||
| 	ulimits       *dockeropts.UlimitOpt | ||||
| 	commonOptions | ||||
| } | ||||
|  | ||||
| @@ -99,6 +100,10 @@ func runBuild(dockerCli command.Cli, in buildOptions) (err error) { | ||||
| 		pull = *in.pull | ||||
| 	} | ||||
|  | ||||
| 	if noCache && len(in.noCacheFilter) > 0 { | ||||
| 		return errors.Errorf("--no-cache and --no-cache-filter cannot currently be used together") | ||||
| 	} | ||||
|  | ||||
| 	if in.quiet && in.progress != "auto" && in.progress != "quiet" { | ||||
| 		return errors.Errorf("progress=%s and quiet cannot be used together", in.progress) | ||||
| 	} else if in.quiet { | ||||
| @@ -117,17 +122,18 @@ func runBuild(dockerCli command.Cli, in buildOptions) (err error) { | ||||
| 			InStream:       os.Stdin, | ||||
| 			NamedContexts:  contexts, | ||||
| 		}, | ||||
| 		BuildArgs:   listToMap(in.buildArgs, true), | ||||
| 		ExtraHosts:  in.extraHosts, | ||||
| 		ImageIDFile: in.imageIDFile, | ||||
| 		Labels:      listToMap(in.labels, false), | ||||
| 		NetworkMode: in.networkMode, | ||||
| 		NoCache:     noCache, | ||||
| 		Pull:        pull, | ||||
| 		ShmSize:     in.shmSize, | ||||
| 		Tags:        in.tags, | ||||
| 		Target:      in.target, | ||||
| 		Ulimits:     in.ulimits, | ||||
| 		BuildArgs:     listToMap(in.buildArgs, true), | ||||
| 		ExtraHosts:    in.extraHosts, | ||||
| 		ImageIDFile:   in.imageIDFile, | ||||
| 		Labels:        listToMap(in.labels, false), | ||||
| 		NetworkMode:   in.networkMode, | ||||
| 		NoCache:       noCache, | ||||
| 		NoCacheFilter: in.noCacheFilter, | ||||
| 		Pull:          pull, | ||||
| 		ShmSize:       in.shmSize, | ||||
| 		Tags:          in.tags, | ||||
| 		Target:        in.target, | ||||
| 		Ulimits:       in.ulimits, | ||||
| 	} | ||||
|  | ||||
| 	platforms, err := platformutil.Parse(in.platforms) | ||||
| @@ -360,6 +366,8 @@ func buildCmd(dockerCli command.Cli, rootOpts *rootOptions) *cobra.Command { | ||||
|  | ||||
| 	flags.StringVar(&options.networkMode, "network", "default", `Set the networking mode for the "RUN" instructions during build`) | ||||
|  | ||||
| 	flags.StringArrayVar(&options.noCacheFilter, "no-cache-filter", []string{}, "Do not cache specified stages") | ||||
|  | ||||
| 	flags.StringArrayVarP(&options.outputs, "output", "o", []string{}, `Output destination (format: "type=local,dest=path")`) | ||||
|  | ||||
| 	flags.StringArrayVar(&options.platforms, "platform", platformsDefault, "Set target platform for build") | ||||
|   | ||||
| @@ -340,7 +340,7 @@ target "db" { | ||||
| Complete list of valid target fields: | ||||
|  | ||||
| `args`, `cache-from`, `cache-to`, `context`, `contexts`, `dockerfile`, `inherits`, `labels`, | ||||
| `no-cache`, `output`, `platform`, `pull`, `secrets`, `ssh`, `tags`, `target` | ||||
| `no-cache`, `no-cache-filter`, `output`, `platform`, `pull`, `secrets`, `ssh`, `tags`, `target` | ||||
|  | ||||
| ### Global scope attributes | ||||
|  | ||||
| @@ -982,7 +982,7 @@ $ docker buildx bake --print | ||||
| Complete list of valid fields for `x-bake`: | ||||
|  | ||||
| `tags`, `cache-from`, `cache-to`, `secret`, `ssh`, `platforms`, `output`, | ||||
| `pull`, `no-cache` | ||||
| `pull`, `no-cache`, `no-cache-filter` | ||||
|  | ||||
| ### Built-in variables | ||||
|  | ||||
|   | ||||
| @@ -30,6 +30,7 @@ Start a build | ||||
| | `--metadata-file string` | Write build result metadata to the file | | ||||
| | `--network string` | Set the networking mode for the `RUN` instructions during build | | ||||
| | `--no-cache` | Do not use cache when building the image | | ||||
| | `--no-cache-filter stringArray` | Do not cache specified stages | | ||||
| | [`-o`](#output), [`--output stringArray`](#output) | Output destination (format: `type=local,dest=path`) | | ||||
| | [`--platform stringArray`](#platform) | Set target platform for build | | ||||
| | [`--progress string`](#progress) | Set type of progress output (`auto`, `plain`, `tty`). Use plain to show container output | | ||||
|   | ||||
		Reference in New Issue
	
	Block a user
	 Tõnis Tiigi
					Tõnis Tiigi