diff --git a/api/server/backend/build/backend.go b/api/server/backend/build/backend.go index 904944a962..546ad5f86d 100644 --- a/api/server/backend/build/backend.go +++ b/api/server/backend/build/backend.go @@ -82,8 +82,8 @@ func (b *Backend) Build(ctx context.Context, config backend.BuildConfig) (string if !useBuildKit { stdout := config.ProgressWriter.StdoutFormatter fmt.Fprintf(stdout, "Successfully built %s\n", stringid.TruncateID(imageID)) + err = tagger.TagImages(image.ID(imageID)) } - err = tagger.TagImages(image.ID(imageID)) return imageID, err } diff --git a/builder/builder-next/builder.go b/builder/builder-next/builder.go index 9e8c1431b7..d4a8120c43 100644 --- a/builder/builder-next/builder.go +++ b/builder/builder-next/builder.go @@ -207,9 +207,16 @@ func (b *Builder) Build(ctx context.Context, opt backend.BuildConfig) (*builder. frontendAttrs["no-cache"] = "" } + exporterAttrs := map[string]string{} + + if len(opt.Options.Tags) > 0 { + exporterAttrs["name"] = strings.Join(opt.Options.Tags, ",") + } + req := &controlapi.SolveRequest{ Ref: id, Exporter: "moby", + ExporterAttrs: exporterAttrs, Frontend: "dockerfile.v0", FrontendAttrs: frontendAttrs, Session: opt.Options.SessionID, diff --git a/builder/builder-next/exporter/export.go b/builder/builder-next/exporter/export.go index ddc36f07e6..818ff00d4e 100644 --- a/builder/builder-next/exporter/export.go +++ b/builder/builder-next/exporter/export.go @@ -3,6 +3,7 @@ package containerimage import ( "context" "fmt" + "strings" distref "github.com/docker/distribution/reference" "github.com/docker/docker/image" @@ -46,11 +47,13 @@ func (e *imageExporter) Resolve(ctx context.Context, opt map[string]string) (exp for k, v := range opt { switch k { case keyImageName: - ref, err := distref.ParseNormalizedNamed(v) - if err != nil { - return nil, err + for _, v := range strings.Split(v, ",") { + ref, err := distref.ParseNormalizedNamed(v) + if err != nil { + return nil, err + } + i.targetNames = append(i.targetNames, ref) } - i.targetName = ref case exporterImageConfig: i.config = []byte(v) default: @@ -62,8 +65,8 @@ func (e *imageExporter) Resolve(ctx context.Context, opt map[string]string) (exp type imageExporterInstance struct { *imageExporter - targetName distref.Named - config []byte + targetNames []distref.Named + config []byte } func (e *imageExporterInstance) Name() string { @@ -126,11 +129,11 @@ func (e *imageExporterInstance) Export(ctx context.Context, ref cache.ImmutableR } configDone(nil) - if e.targetName != nil { - if e.opt.ReferenceStore != nil { - tagDone := oneOffProgress(ctx, "naming to "+e.targetName.String()) + if e.opt.ReferenceStore != nil { + for _, targetName := range e.targetNames { + tagDone := oneOffProgress(ctx, "naming to "+targetName.String()) - if err := e.opt.ReferenceStore.AddTag(e.targetName, digest.Digest(id), true); err != nil { + if err := e.opt.ReferenceStore.AddTag(targetName, digest.Digest(id), true); err != nil { return nil, tagDone(err) } tagDone(nil)