build: handle push/load shorthands for multi exporters

Signed-off-by: CrazyMax <1951866+crazy-max@users.noreply.github.com>
(cherry picked from commit a03263acf86c9fec127d4365d1e3996205254299)
This commit is contained in:
CrazyMax 2024-03-05 08:52:28 +01:00 committed by Tonis Tiigi
parent 84913655a8
commit 1861c07eab
No known key found for this signature in database
GPG Key ID: AFA9DE5F8AB7AF39
2 changed files with 26 additions and 28 deletions

View File

@ -72,11 +72,9 @@ func runBake(ctx context.Context, dockerCli command.Cli, targets []string, in ba
overrides := in.overrides overrides := in.overrides
if in.exportPush { if in.exportPush {
if in.exportLoad { overrides = append(overrides, "*.output=type=registry")
return errors.Errorf("push and load may not be set together at the moment") }
} if in.exportLoad {
overrides = append(overrides, "*.push=true")
} else if in.exportLoad {
overrides = append(overrides, "*.output=type=docker") overrides = append(overrides, "*.output=type=docker")
} }
if cFlags.noCache != nil { if cFlags.noCache != nil {

View File

@ -99,38 +99,38 @@ func RunBuild(ctx context.Context, dockerCli command.Cli, in controllerapi.Build
return nil, nil, err return nil, nil, err
} }
if in.ExportPush { if in.ExportPush {
if in.ExportLoad { var pushUsed bool
return nil, nil, errors.Errorf("push and load may not be set together at the moment") for i := range outputs {
if outputs[i].Type == client.ExporterImage {
outputs[i].Attrs["push"] = "true"
pushUsed = true
}
} }
if len(outputs) == 0 { if !pushUsed {
outputs = []client.ExportEntry{{ outputs = append(outputs, client.ExportEntry{
Type: "image", Type: client.ExporterImage,
Attrs: map[string]string{ Attrs: map[string]string{
"push": "true", "push": "true",
}, },
}} })
} else {
switch outputs[0].Type {
case "image":
outputs[0].Attrs["push"] = "true"
default:
return nil, nil, errors.Errorf("push and %q output can't be used together", outputs[0].Type)
}
} }
} }
if in.ExportLoad { if in.ExportLoad {
if len(outputs) == 0 { var loadUsed bool
outputs = []client.ExportEntry{{ for i := range outputs {
Type: "docker", if outputs[i].Type == client.ExporterDocker {
Attrs: map[string]string{}, if _, ok := outputs[i].Attrs["dest"]; !ok {
}} loadUsed = true
} else { break
switch outputs[0].Type { }
case "docker":
default:
return nil, nil, errors.Errorf("load and %q output can't be used together", outputs[0].Type)
} }
} }
if !loadUsed {
outputs = append(outputs, client.ExportEntry{
Type: client.ExporterDocker,
Attrs: map[string]string{},
})
}
} }
annotations, err := buildflags.ParseAnnotations(in.Annotations) annotations, err := buildflags.ParseAnnotations(in.Annotations)