@@ -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}
@@ -408,15 +416,18 @@ func containerEngineBuildV20180708(verbose bool, fpath string, ff *FuncFileV2018
408416 return nil
409417}
410418
411- func buildXDockerCommand (imageName , dockerfile string , buildArgs []string , noCache bool , architectures []string ) []string {
419+ func buildXDockerCommand (imageName , dockerfile string , buildArgs []string , noCache bool , architectures []string , containerEngineType string ) []string {
412420 var buildCommand = "buildx"
413421 var name = imageName
414422
423+ plat := strings .Join (architectures ,"," )
424+ fmt .Println ("buildX platform is %v" , plat )
415425 args := []string {
416426 buildCommand ,
417427 "build" ,
418428 "-t" , name ,
419429 "-f" , dockerfile ,
430+ //"--load",
420431 "--platform" , strings .Join (architectures , "," ),
421432 }
422433
@@ -435,7 +446,15 @@ func buildXDockerCommand(imageName, dockerfile string, buildArgs []string, noCac
435446 var label = "imageName=" + imageName
436447 args = append (args , "--build-arg" , arg )
437448 args = append (args , "--label" , label )
449+ }
450+
451+ if containerEngineType != containerEngineTypeDocker {
452+ fmt .Println ("*** engine type not docker append load" )
453+ args = append (args , "--load" )
454+ } else {
455+ fmt .Println ("*** engine type docker append push" )
438456 args = append (args , "--push" )
457+
439458 }
440459
441460 args = append (args ,
@@ -512,20 +531,30 @@ func RunBuild(verbose bool, dir, imageName, dockerfile string, buildArgs []strin
512531 go func (done chan <- error ) {
513532 var dockerBuildCmdArgs []string
514533 // Depending whether architecture list is passed or not trigger docker buildx or docker build accordingly
515- var mappedArchitectures [] string
534+
516535 if arch , ok := ShapeMap [shape ]; ok {
536+ var mappedArchitectures []string
517537 mappedArchitectures = append (mappedArchitectures , arch ... )
518- err := initializeContainerBuilder (containerEngineType , mappedArchitectures )
519- if err != nil {
520- done <- err
521- return
538+ var hostedPlatform = runtime .GOARCH
539+ if platform , ok := TargetPlatformMap [shape ]; ok {
540+ // create target platform string to compare with hosted platform
541+ targetPlatform := strings .Join (platform ," " )
542+ fmt .Println ("hosted platform %v target platform %v" , hostedPlatform , targetPlatform )
543+ if targetPlatform != hostedPlatform {
544+ fmt .Println ("TargetedPlatform and hostPlatform are not same" )
545+ err := initializeContainerBuilder (containerEngineType , mappedArchitectures )
546+ if err != nil {
547+ done <- err
548+ return
549+ }
550+ dockerBuildCmdArgs = buildXDockerCommand (imageName , dockerfile , buildArgs , noCache , mappedArchitectures , containerEngineType )
551+ // perform cleanup
552+ defer cleanupContainerBuilder (containerEngineType )
553+ } else {
554+ fmt .Println ("TargetedPlatform and hostPlatform are same" )
555+ dockerBuildCmdArgs = buildDockerCommand (imageName , dockerfile , buildArgs , noCache )
556+ }
522557 }
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 )
529558 }
530559
531560 cmd := exec .Command (containerEngineType , dockerBuildCmdArgs ... )
@@ -551,6 +580,18 @@ func RunBuild(verbose bool, dir, imageName, dockerfile string, buildArgs []strin
551580 fmt .Fprintln (os .Stderr )
552581 return fmt .Errorf ("build cancelled on signal %v" , signal )
553582 }
583+ if containerEngineType != containerEngineTypeDocker {
584+ fmt .Println ("Using Container engine" , containerEngineType , "to push as --push id only for docker and --load is for podman" )
585+ // Push to docker registry
586+ fmt .Println ("Using Container engine" , containerEngineType , "to push" )
587+ fmt .Printf ("Pushing %v to docker registry..." , imageName )
588+ cmd := exec .Command (containerEngineType , "push" , imageName )
589+ cmd .Stderr = os .Stderr
590+ cmd .Stdout = os .Stdout
591+ if err := cmd .Run (); err != nil {
592+ return fmt .Errorf ("error running %v push, are you logged?: %v" , containerEngineType , err )
593+ }
594+ }
554595 return nil
555596}
556597
@@ -620,6 +661,10 @@ func isSupportedByDefaultBuildxPlatforms(containerEngineType string, platforms [
620661
621662func initializeContainerBuilder (containerEngineType string , platforms []string ) error {
622663
664+ if containerEngineType != containerEngineTypeDocker {
665+ fmt .Println ("engine type not docker return nil" )
666+ return nil
667+ }
623668 if isSupportedByDefaultBuildxPlatforms (containerEngineType , platforms ) {
624669 return nil
625670 }
0 commit comments