@@ -126,14 +126,14 @@ func runBuilder(builder BuilderSpec, buildCtx *BuildContext, opDesc string, cmdT
126126}
127127
128128func buildAndPushOneDockerImage (dockerImage DockerImageSpec , buildCtx * BuildContext ) error {
129- tagWithoutVersion := dockerImage . Image
130- tag := tagWithoutVersion + ":" + buildCtx . RevisionId . FriendlyRevisionId
131- tagLatest := tagWithoutVersion + ":latest"
132- dockerfilePath := dockerImage . DockerfilePath
133-
134- // only tag latest from the default branch (= main / master / ...), because it is expected
135- // that non-default branch builds are dev/experimental builds.
136- shouldTagLatest := dockerImage . TagLatest && buildCtx . IsDefaultBranch
129+ tagSpecs := func () [] TagSpec {
130+ if len ( dockerImage . Tags ) > 0 {
131+ return dockerImage . Tags
132+ } else {
133+ return createBackwardsCompatTagSpecs ( dockerImage . TagLatest )
134+ }
135+ }()
136+ tags := expandTagSpecs ( tagSpecs , buildCtx , dockerImage . Image )
137137
138138 labelArgs := []string {
139139 "--label=org.opencontainers.image.created=" + time .Now ().UTC ().Format (time .RFC3339 ),
@@ -151,9 +151,9 @@ func buildAndPushOneDockerImage(dockerImage DockerImageSpec, buildCtx *BuildCont
151151 // "" => "."
152152 // "Dockerfile" => "."
153153 // "subdir/Dockerfile" => "subdir"
154- buildContextDir := filepath .Dir (dockerfilePath )
154+ buildContextDir := filepath .Dir (dockerImage . DockerfilePath )
155155
156- printHeading (fmt .Sprintf ("Building %s" , tag ))
156+ printHeading (fmt .Sprintf ("Building %s" , dockerImage . Image ))
157157
158158 // use buildx when platforms set. it's almost same as "$ docker build" but it almost transparently
159159 // supports cross-architecture builds via binftm_misc + QEMU userspace emulation
@@ -166,16 +166,11 @@ func buildAndPushOneDockerImage(dockerImage DockerImageSpec, buildCtx *BuildCont
166166 "buildx" ,
167167 "build" ,
168168 "--platform" , strings .Join (dockerImage .Platforms , "," ),
169- "--file" , dockerfilePath ,
170- "--tag=" + tag ,
169+ "--file" , dockerImage .DockerfilePath ,
171170 }
172171
172+ args = append (args , dockerTagArgs (tags )... )
173173 args = append (args , labelArgs ... )
174-
175- if shouldTagLatest {
176- args = append (args , "--tag=" + tagLatest )
177- }
178-
179174 args = append (args , buildContextDir )
180175
181176 if buildCtx .PublishArtefacts {
@@ -190,8 +185,8 @@ func buildAndPushOneDockerImage(dockerImage DockerImageSpec, buildCtx *BuildCont
190185
191186 dockerBuildArgs := []string {"docker" ,
192187 "build" ,
193- "--file" , dockerfilePath ,
194- "--tag" , tag }
188+ "--file" , dockerImage . DockerfilePath }
189+ dockerBuildArgs = append ( dockerBuildArgs , dockerTagArgs ( tags ) ... )
195190 dockerBuildArgs = append (dockerBuildArgs , labelArgs ... )
196191 dockerBuildArgs = append (dockerBuildArgs , buildContextDir )
197192
@@ -218,21 +213,11 @@ func buildAndPushOneDockerImage(dockerImage DockerImageSpec, buildCtx *BuildCont
218213 return nil
219214 }
220215
221- if err := pushTag (tag ); err != nil {
222- return err
223- }
224-
225- if shouldTagLatest {
226- if err := exec .Command ("docker" , "tag" , tag , tagLatest ).Run (); err != nil {
227- return fmt .Errorf ("tagging failed %s -> %s failed: %v" , tag , tagLatest , err )
228- }
229-
230- if err := pushTag (tagLatest ); err != nil {
216+ for _ , tag := range tags {
217+ if err := pushTag (tag ); err != nil {
231218 return err
232219 }
233220 }
234-
235- return nil
236221 }
237222
238223 return nil
0 commit comments