@@ -32,6 +32,7 @@ import (
3232 "os/exec"
3333 "os/signal"
3434 "path/filepath"
35+ "runtime"
3536 "strings"
3637 "time"
3738 "unicode"
@@ -55,6 +56,7 @@ const (
5556 MinRequiredDockerVersion = "17.5.0"
5657 BuildxBuilderInstance = "oci_fn_builder"
5758 DefaultAppShape = modelsv2 .AppShapeGENERICX86
59+ containerEngineTypeDocker = "docker"
5860)
5961
6062var GlobalVerbose bool
@@ -66,6 +68,12 @@ var ShapeMap = map[string][]string{
6668 modelsv2 .AppShapeGENERICX86ARM : {"linux/amd64" , "linux/arm64" },
6769}
6870
71+ var TargetPlatformMap = map [string ][]string {
72+ modelsv2 .AppShapeGENERICX86 : {"amd64" },
73+ modelsv2 .AppShapeGENERICARM : {"arm64" },
74+ modelsv2 .AppShapeGENERICX86ARM : {"amd64_arm64" },
75+ }
76+
6977func IsVerbose () bool {
7078 return GlobalVerbose || CommandVerbose
7179}
@@ -435,7 +443,6 @@ func buildXDockerCommand(imageName, dockerfile string, buildArgs []string, noCac
435443 var label = "imageName=" + imageName
436444 args = append (args , "--build-arg" , arg )
437445 args = append (args , "--label" , label )
438- args = append (args , "--push" )
439446 }
440447
441448 args = append (args ,
@@ -512,20 +519,30 @@ func RunBuild(verbose bool, dir, imageName, dockerfile string, buildArgs []strin
512519 go func (done chan <- error ) {
513520 var dockerBuildCmdArgs []string
514521 // Depending whether architecture list is passed or not trigger docker buildx or docker build accordingly
515- var mappedArchitectures [] string
522+
516523 if arch , ok := ShapeMap [shape ]; ok {
524+ var mappedArchitectures []string
517525 mappedArchitectures = append (mappedArchitectures , arch ... )
518- err := initializeContainerBuilder (containerEngineType , mappedArchitectures )
519- if err != nil {
520- done <- err
521- return
526+ var hostedPlatform = runtime .GOARCH
527+ if platform , ok := TargetPlatformMap [shape ]; ok {
528+ // create target platform string to compare with hosted platform
529+ targetPlatform := strings .Join (platform ," " )
530+ fmt .Println ("hosted platform %v target platform %v" , hostedPlatform , targetPlatform )
531+ if targetPlatform != hostedPlatform {
532+ fmt .Println ("TargetedPlatform and hostPlatform are not same" )
533+ err := initializeContainerBuilder (containerEngineType , mappedArchitectures )
534+ if err != nil {
535+ done <- err
536+ return
537+ }
538+ dockerBuildCmdArgs = buildXDockerCommand (imageName , dockerfile , buildArgs , noCache , mappedArchitectures )
539+ // perform cleanup
540+ defer cleanupContainerBuilder (containerEngineType )
541+ } else {
542+ fmt .Println ("TargetedPlatform and hostPlatform are same" )
543+ dockerBuildCmdArgs = buildDockerCommand (imageName , dockerfile , buildArgs , noCache )
544+ }
522545 }
523-
524- dockerBuildCmdArgs = buildXDockerCommand (imageName , dockerfile , buildArgs , noCache , mappedArchitectures )
525- // perform cleanup
526- defer cleanupContainerBuilder (containerEngineType )
527- } else {
528- dockerBuildCmdArgs = buildDockerCommand (imageName , dockerfile , buildArgs , noCache )
529546 }
530547
531548 cmd := exec .Command (containerEngineType , dockerBuildCmdArgs ... )
@@ -551,6 +568,15 @@ func RunBuild(verbose bool, dir, imageName, dockerfile string, buildArgs []strin
551568 fmt .Fprintln (os .Stderr )
552569 return fmt .Errorf ("build cancelled on signal %v" , signal )
553570 }
571+ // Push to docker registry
572+ fmt .Println ("Using Container engine" , containerEngineType , "to push" )
573+ fmt .Printf ("Pushing %v to docker registry..." , imageName )
574+ cmd := exec .Command (containerEngineType , "push" , imageName )
575+ cmd .Stderr = os .Stderr
576+ cmd .Stdout = os .Stdout
577+ if err := cmd .Run (); err != nil {
578+ return fmt .Errorf ("error running %v push, are you logged?: %v" , containerEngineType , err )
579+ }
554580 return nil
555581}
556582
@@ -620,6 +646,9 @@ func isSupportedByDefaultBuildxPlatforms(containerEngineType string, platforms [
620646
621647func initializeContainerBuilder (containerEngineType string , platforms []string ) error {
622648
649+ if containerEngineType == containerEngineTypeDocker {
650+ return nil
651+ }
623652 if isSupportedByDefaultBuildxPlatforms (containerEngineType , platforms ) {
624653 return nil
625654 }
0 commit comments