@@ -11,9 +11,11 @@ import (
1111 "github.com/docker/buildx/util/platformutil"
1212 "github.com/docker/cli/cli/command"
1313 "github.com/docker/cli/cli/context/docker"
14+ "github.com/docker/cli/cli/context/kubernetes"
1415 dopts "github.com/docker/cli/opts"
1516 dockerclient "github.com/docker/docker/client"
1617 "github.com/pkg/errors"
18+ "github.com/sirupsen/logrus"
1719 "golang.org/x/sync/errgroup"
1820)
1921
@@ -133,7 +135,7 @@ func getNodeGroup(txn *store.Txn, dockerCli command.Cli, name string) (*store.No
133135}
134136
135137// driversForNodeGroup returns drivers for a nodegroup instance
136- func driversForNodeGroup (ctx context.Context , dockerCli command.Cli , ng * store.NodeGroup ) ([]build.DriverInfo , error ) {
138+ func driversForNodeGroup (ctx context.Context , dockerCli command.Cli , ng * store.NodeGroup , contextPathHash string ) ([]build.DriverInfo , error ) {
137139 eg , _ := errgroup .WithContext (ctx )
138140
139141 dis := make ([]build.DriverInfo , len (ng .Nodes ))
@@ -174,7 +176,18 @@ func driversForNodeGroup(ctx context.Context, dockerCli command.Cli, ng *store.N
174176 // TODO: replace the following line with dockerclient.WithAPIVersionNegotiation option in clientForEndpoint
175177 dockerapi .NegotiateAPIVersion (ctx )
176178
177- d , err := driver .GetDriver (ctx , "buildx_buildkit_" + n .Name , f , dockerapi , n .Flags , n .ConfigFile , n .DriverOpts )
179+ contextStore := dockerCli .ContextStore ()
180+ kcc , err := kubernetes .ConfigFromContext (n .Endpoint , contextStore )
181+ if err != nil {
182+ // err is returned if n.Endpoint is non-context name like "unix:///var/run/docker.sock".
183+ // try again with name="default".
184+ // FIXME: n should retain real context name.
185+ kcc , err = kubernetes .ConfigFromContext ("default" , contextStore )
186+ if err != nil {
187+ logrus .Error (err )
188+ }
189+ }
190+ d , err := driver .GetDriver (ctx , "buildx_buildkit_" + n .Name , f , dockerapi , kcc , n .Flags , n .ConfigFile , n .DriverOpts , contextPathHash )
178191 if err != nil {
179192 di .Err = err
180193 return nil
@@ -235,7 +248,7 @@ func clientForEndpoint(dockerCli command.Cli, name string) (dockerclient.APIClie
235248}
236249
237250// getDefaultDrivers returns drivers based on current cli config
238- func getDefaultDrivers (ctx context.Context , dockerCli command.Cli ) ([]build.DriverInfo , error ) {
251+ func getDefaultDrivers (ctx context.Context , dockerCli command.Cli , contextPathHash string ) ([]build.DriverInfo , error ) {
239252 txn , release , err := getStore (dockerCli )
240253 if err != nil {
241254 return nil , err
@@ -248,10 +261,10 @@ func getDefaultDrivers(ctx context.Context, dockerCli command.Cli) ([]build.Driv
248261 }
249262
250263 if ng != nil {
251- return driversForNodeGroup (ctx , dockerCli , ng )
264+ return driversForNodeGroup (ctx , dockerCli , ng , contextPathHash )
252265 }
253266
254- d , err := driver .GetDriver (ctx , "buildx_buildkit_default" , nil , dockerCli .Client (), nil , "" , nil )
267+ d , err := driver .GetDriver (ctx , "buildx_buildkit_default" , nil , dockerCli .Client (), nil , nil , "" , nil , contextPathHash )
255268 if err != nil {
256269 return nil , err
257270 }
@@ -294,7 +307,7 @@ func loadInfoData(ctx context.Context, d *dinfo) error {
294307func loadNodeGroupData (ctx context.Context , dockerCli command.Cli , ngi * nginfo ) error {
295308 eg , _ := errgroup .WithContext (ctx )
296309
297- dis , err := driversForNodeGroup (ctx , dockerCli , ngi .ng )
310+ dis , err := driversForNodeGroup (ctx , dockerCli , ngi .ng , "" )
298311 if err != nil {
299312 return err
300313 }
@@ -312,7 +325,30 @@ func loadNodeGroupData(ctx context.Context, dockerCli command.Cli, ngi *nginfo)
312325 }(& ngi .drivers [i ])
313326 }
314327
315- return eg .Wait ()
328+ if eg .Wait (); err != nil {
329+ return err
330+ }
331+ for _ , di := range ngi .drivers {
332+ // dynamic nodes are used in Kubernetes driver.
333+ // Kubernetes pods are dynamically mapped to BuildKit Nodes.
334+ if di .info != nil && len (di .info .DynamicNodes ) > 0 {
335+ var drivers []dinfo
336+ for i := 0 ; i < len (di .info .DynamicNodes ); i ++ {
337+ // all []dinfo share *build.DriverInfo and *driver.Info
338+ diClone := di
339+ if pl := di .info .DynamicNodes [i ].Platforms ; len (pl ) > 0 {
340+ diClone .platforms = pl
341+ }
342+ drivers = append (drivers , di )
343+ }
344+ // not append (remove the static nodes in the store)
345+ ngi .ng .Nodes = di .info .DynamicNodes
346+ ngi .ng .Dynamic = true
347+ ngi .drivers = drivers
348+ return nil
349+ }
350+ }
351+ return nil
316352}
317353
318354func dockerAPI (dockerCli command.Cli ) * api {
0 commit comments