Skip to content

Commit 5af9738

Browse files
committed
bake: fix output handling for push and load
Signed-off-by: CrazyMax <[email protected]>
1 parent 4327ee7 commit 5af9738

4 files changed

Lines changed: 120 additions & 7 deletions

File tree

bake/bake.go

Lines changed: 34 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -907,6 +907,27 @@ func (t *Target) AddOverrides(overrides map[string]Override) error {
907907
}
908908
}
909909
}
910+
case "load":
911+
load, err := strconv.ParseBool(value)
912+
if err != nil {
913+
return errors.Errorf("invalid value %s for boolean key load", value)
914+
}
915+
if load {
916+
var loadUsed bool
917+
for _, output := range t.Outputs {
918+
if typ := parseOutputType(output); typ == "docker" {
919+
if v := parseOutput(output); v != nil {
920+
if _, ok := v["dest"]; !ok {
921+
loadUsed = true
922+
break
923+
}
924+
}
925+
}
926+
}
927+
if !loadUsed {
928+
t.Outputs = append(t.Outputs, "type=docker")
929+
}
930+
}
910931
default:
911932
return errors.Errorf("unknown key: %s", keys[0])
912933
}
@@ -1394,18 +1415,26 @@ func removeAttestDupes(s []string) []string {
13941415
return res
13951416
}
13961417

1397-
func parseOutputType(str string) string {
1418+
func parseOutput(str string) map[string]string {
13981419
csvReader := csv.NewReader(strings.NewReader(str))
13991420
fields, err := csvReader.Read()
14001421
if err != nil {
1401-
return ""
1422+
return nil
14021423
}
1424+
res := map[string]string{}
14031425
for _, field := range fields {
14041426
parts := strings.SplitN(field, "=", 2)
14051427
if len(parts) == 2 {
1406-
if parts[0] == "type" {
1407-
return parts[1]
1408-
}
1428+
res[parts[0]] = parts[1]
1429+
}
1430+
}
1431+
return res
1432+
}
1433+
1434+
func parseOutputType(str string) string {
1435+
if out := parseOutput(str); out != nil {
1436+
if v, ok := out["type"]; ok {
1437+
return v
14091438
}
14101439
}
14111440
return ""

bake/bake_test.go

Lines changed: 83 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -259,6 +259,89 @@ func TestPushOverride(t *testing.T) {
259259

260260
require.Equal(t, 1, len(m["app"].Outputs))
261261
require.Equal(t, "type=image,push=true", m["app"].Outputs[0])
262+
263+
fp = File{
264+
Name: "docker-bake.hcl",
265+
Data: []byte(
266+
`target "foo" {
267+
output = [ "type=local,dest=out" ]
268+
}
269+
target "bar" {
270+
}`),
271+
}
272+
ctx = context.TODO()
273+
m, _, err = ReadTargets(ctx, []File{fp}, []string{"foo", "bar"}, []string{"*.push=true"}, nil)
274+
require.NoError(t, err)
275+
276+
require.Equal(t, 2, len(m))
277+
require.Equal(t, 1, len(m["foo"].Outputs))
278+
require.Equal(t, []string{"type=local,dest=out"}, m["foo"].Outputs)
279+
require.Equal(t, 1, len(m["bar"].Outputs))
280+
require.Equal(t, []string{"type=image,push=true"}, m["bar"].Outputs)
281+
}
282+
283+
func TestLoadOverride(t *testing.T) {
284+
t.Parallel()
285+
286+
fp := File{
287+
Name: "docker-bake.hcl",
288+
Data: []byte(
289+
`target "app" {
290+
}`),
291+
}
292+
ctx := context.TODO()
293+
m, _, err := ReadTargets(ctx, []File{fp}, []string{"app"}, []string{"*.load=true"}, nil)
294+
require.NoError(t, err)
295+
296+
require.Equal(t, 1, len(m["app"].Outputs))
297+
require.Equal(t, "type=docker", m["app"].Outputs[0])
298+
299+
fp = File{
300+
Name: "docker-bake.hcl",
301+
Data: []byte(
302+
`target "app" {
303+
output = ["type=image"]
304+
}`),
305+
}
306+
ctx = context.TODO()
307+
m, _, err = ReadTargets(ctx, []File{fp}, []string{"app"}, []string{"*.load=true"}, nil)
308+
require.NoError(t, err)
309+
310+
require.Equal(t, 2, len(m["app"].Outputs))
311+
require.Equal(t, []string{"type=image", "type=docker"}, m["app"].Outputs)
312+
313+
fp = File{
314+
Name: "docker-bake.hcl",
315+
Data: []byte(
316+
`target "app" {
317+
output = ["type=docker,dest=out"]
318+
}`),
319+
}
320+
ctx = context.TODO()
321+
m, _, err = ReadTargets(ctx, []File{fp}, []string{"app"}, []string{"*.load=true"}, nil)
322+
require.NoError(t, err)
323+
324+
require.Equal(t, 2, len(m["app"].Outputs))
325+
require.Equal(t, []string{"type=docker,dest=out", "type=docker"}, m["app"].Outputs)
326+
327+
fp = File{
328+
Name: "docker-bake.hcl",
329+
Data: []byte(
330+
`target "foo" {
331+
output = [ "type=local,dest=out" ]
332+
}
333+
target "bar" {
334+
}`),
335+
}
336+
ctx = context.TODO()
337+
m, _, err = ReadTargets(ctx, []File{fp}, []string{"foo", "bar"}, []string{"*.load=true"}, nil)
338+
require.NoError(t, err)
339+
340+
require.Equal(t, 2, len(m))
341+
require.Equal(t, 2, len(m["foo"].Outputs))
342+
require.Equal(t, []string{"type=local,dest=out", "type=docker"}, m["foo"].Outputs)
343+
require.Equal(t, 1, len(m["bar"].Outputs))
344+
require.Equal(t, []string{"type=docker"}, m["bar"].Outputs)
262345
}
263346

264347
func TestReadTargetsCompose(t *testing.T) {

commands/bake.go

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -72,10 +72,10 @@ func runBake(ctx context.Context, dockerCli command.Cli, targets []string, in ba
7272

7373
overrides := in.overrides
7474
if in.exportPush {
75-
overrides = append(overrides, "*.output=type=registry")
75+
overrides = append(overrides, "*.push=true")
7676
}
7777
if in.exportLoad {
78-
overrides = append(overrides, "*.output=type=docker")
78+
overrides = append(overrides, "*.load=true")
7979
}
8080
if cFlags.noCache != nil {
8181
overrides = append(overrides, fmt.Sprintf("*.no-cache=%t", *cFlags.noCache))

docs/reference/buildx_bake.md

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -162,6 +162,7 @@ You can override the following fields:
162162
* `context`
163163
* `dockerfile`
164164
* `labels`
165+
* `load`
165166
* `no-cache`
166167
* `no-cache-filter`
167168
* `output`

0 commit comments

Comments
 (0)