@@ -15,6 +15,7 @@ import (
1515 "os"
1616 "path"
1717 "path/filepath"
18+ "slices"
1819 "sort"
1920 "strings"
2021
@@ -75,6 +76,13 @@ func BuildImage(image string, handler string, functionName string, language stri
7576
7677 imageName := schema .BuildImageName (tagFormat , image , version , branch )
7778
79+ buildOptPackages , err := getBuildOptionPackages (buildOptions , language , langTemplate .BuildOptions )
80+ if err != nil {
81+ return err
82+
83+ }
84+ buildArgMap = appendAdditionalPackages (buildArgMap , buildOptPackages )
85+
7886 fmt .Printf ("Building: %s with %s template. Please wait..\n " , imageName , language )
7987
8088 if remoteBuilder != "" {
@@ -129,23 +137,15 @@ func BuildImage(image string, handler string, functionName string, language stri
129137 }
130138
131139 } else {
132-
133- buildOptPackages , err := getBuildOptionPackages (buildOptions , language , langTemplate .BuildOptions )
134- if err != nil {
135- return err
136-
137- }
138-
139140 dockerBuildVal := dockerBuild {
140- Image : imageName ,
141- NoCache : nocache ,
142- Squash : squash ,
143- HTTPProxy : os .Getenv ("http_proxy" ),
144- HTTPSProxy : os .Getenv ("https_proxy" ),
145- BuildArgMap : buildArgMap ,
146- BuildOptPackages : buildOptPackages ,
147- BuildLabelMap : buildLabelMap ,
148- ForcePull : forcePull ,
141+ Image : imageName ,
142+ NoCache : nocache ,
143+ Squash : squash ,
144+ HTTPProxy : os .Getenv ("http_proxy" ),
145+ HTTPSProxy : os .Getenv ("https_proxy" ),
146+ BuildArgMap : buildArgMap ,
147+ BuildLabelMap : buildLabelMap ,
148+ ForcePull : forcePull ,
149149 }
150150
151151 command , args := getDockerBuildCommand (dockerBuildVal )
@@ -280,7 +280,7 @@ func hashFolder(contextPath string) (string, error) {
280280}
281281
282282func getDockerBuildCommand (build dockerBuild ) (string , []string ) {
283- flagSlice := buildFlagSlice (build .NoCache , build .Squash , build .HTTPProxy , build .HTTPSProxy , build .BuildArgMap , build .BuildOptPackages , build . BuildLabelMap , build .ForcePull )
283+ flagSlice := buildFlagSlice (build .NoCache , build .Squash , build .HTTPProxy , build .HTTPSProxy , build .BuildArgMap , build .BuildLabelMap , build .ForcePull )
284284 args := []string {"build" }
285285 args = append (args , flagSlice ... )
286286
@@ -292,15 +292,14 @@ func getDockerBuildCommand(build dockerBuild) (string, []string) {
292292}
293293
294294type dockerBuild struct {
295- Image string
296- Version string
297- NoCache bool
298- Squash bool
299- HTTPProxy string
300- HTTPSProxy string
301- BuildArgMap map [string ]string
302- BuildOptPackages []string
303- BuildLabelMap map [string ]string
295+ Image string
296+ Version string
297+ NoCache bool
298+ Squash bool
299+ HTTPProxy string
300+ HTTPSProxy string
301+ BuildArgMap map [string ]string
302+ BuildLabelMap map [string ]string
304303
305304 // Platforms for use with buildx and publish command
306305 Platforms string
@@ -336,7 +335,7 @@ func pathInScope(path string, scope string) (string, error) {
336335 return "" , fmt .Errorf ("forbidden path appears to be outside of the build context: %s (%s)" , path , abs )
337336}
338337
339- func buildFlagSlice (nocache bool , squash bool , httpProxy string , httpsProxy string , buildArgMap map [string ]string , buildOptionPackages [] string , buildLabelMap map [string ]string , forcePull bool ) []string {
338+ func buildFlagSlice (nocache bool , squash bool , httpProxy string , httpsProxy string , buildArgMap map [string ]string , buildLabelMap map [string ]string , forcePull bool ) []string {
340339
341340 var spaceSafeBuildFlags []string
342341
@@ -356,16 +355,7 @@ func buildFlagSlice(nocache bool, squash bool, httpProxy string, httpsProxy stri
356355 }
357356
358357 for k , v := range buildArgMap {
359-
360- if k != AdditionalPackageBuildArg {
361- spaceSafeBuildFlags = append (spaceSafeBuildFlags , "--build-arg" , fmt .Sprintf ("%s=%s" , k , v ))
362- } else {
363- buildOptionPackages = append (buildOptionPackages , strings .Split (v , " " )... )
364- }
365- }
366- if len (buildOptionPackages ) > 0 {
367- buildOptionPackages = deDuplicate (buildOptionPackages )
368- spaceSafeBuildFlags = append (spaceSafeBuildFlags , "--build-arg" , fmt .Sprintf ("%s=%s" , AdditionalPackageBuildArg , strings .Join (buildOptionPackages , " " )))
358+ spaceSafeBuildFlags = append (spaceSafeBuildFlags , "--build-arg" , fmt .Sprintf ("%s=%s" , k , v ))
369359 }
370360
371361 for k , v := range buildLabelMap {
@@ -379,6 +369,32 @@ func buildFlagSlice(nocache bool, squash bool, httpProxy string, httpsProxy stri
379369 return spaceSafeBuildFlags
380370}
381371
372+ // appendAdditionalPackages appends additional packages to the ADDITIONAL_PACKAGE build arg.
373+ // If the ADDITIONAL_PACKAGE build arg is not present, it is created.
374+ // If the ADDITIONAL_PACKAGE build arg is present, the packages are appended to the list.
375+ func appendAdditionalPackages (buildArgs map [string ]string , additionalPackages []string ) map [string ]string {
376+ for k , v := range buildArgs {
377+ if k == AdditionalPackageBuildArg {
378+ packages := strings .Split (v , " " )
379+ for i := range packages {
380+ packages [i ] = strings .TrimSpace (packages [i ])
381+ }
382+
383+ // Remove empty strings
384+ packages = slices .DeleteFunc (packages , func (s string ) bool {
385+ return len (s ) == 0
386+ })
387+
388+ additionalPackages = append (additionalPackages , packages ... )
389+ }
390+ }
391+ additionalPackages = deDuplicate (additionalPackages )
392+ sort .Strings (additionalPackages )
393+ buildArgs [AdditionalPackageBuildArg ] = strings .Join (additionalPackages , " " )
394+
395+ return buildArgs
396+ }
397+
382398func ensureHandlerPath (handler string ) error {
383399 if _ , err := os .Stat (handler ); err != nil {
384400 return err
@@ -432,7 +448,6 @@ func getPackages(availableBuildOptions []stack.BuildOption, requestedBuildOption
432448}
433449
434450func deDuplicate (buildOptPackages []string ) []string {
435-
436451 seenPackages := map [string ]bool {}
437452 retPackages := []string {}
438453
0 commit comments