@@ -677,6 +677,12 @@ type ContainerConfig struct {
677
677
Cwd * string
678
678
679
679
Initial bool
680
+
681
+ SignalCh <- chan syscall.Signal
682
+ ResizeCh <- chan gateway.WinSize
683
+
684
+ Image string
685
+ ResultMountPath string
680
686
}
681
687
682
688
// ResultContext is a build result with the client that built it.
@@ -748,6 +754,29 @@ func Invoke(ctx context.Context, cfg ContainerConfig) error {
748
754
containerCfg , processCfg = * ccfg , * pcfg
749
755
}
750
756
757
+ if img := cfg .Image ; img != "" {
758
+ def , err := llb .Image (img ).Marshal (ctx )
759
+ if err != nil {
760
+ return nil , err
761
+ }
762
+ r , err := c .Solve (ctx , gateway.SolveRequest {
763
+ Definition : def .ToPB (),
764
+ })
765
+ if err != nil {
766
+ return nil , err
767
+ }
768
+ for i := range containerCfg .Mounts {
769
+ containerCfg .Mounts [i ].Dest = filepath .Join (cfg .ResultMountPath , containerCfg .Mounts [i ].Dest )
770
+ }
771
+ containerCfg .Mounts = append ([]gateway.Mount {
772
+ {
773
+ Dest : "/" ,
774
+ MountType : pb .MountType_BIND ,
775
+ Ref : r .Ref ,
776
+ },
777
+ }, containerCfg .Mounts ... )
778
+ }
779
+
751
780
ctr , err := c .NewContainer (ctx , containerCfg )
752
781
if err != nil {
753
782
return nil , err
@@ -758,8 +787,34 @@ func Invoke(ctx context.Context, cfg ContainerConfig) error {
758
787
if err != nil {
759
788
return nil , errors .Errorf ("failed to start container: %v" , err )
760
789
}
790
+ signalCh := cfg .SignalCh
791
+ if signalCh == nil {
792
+ signalCh = make (chan syscall.Signal )
793
+ }
794
+ resizeCh := cfg .ResizeCh
795
+ if resizeCh == nil {
796
+ resizeCh = make (chan gateway.WinSize )
797
+ }
761
798
errCh := make (chan error )
762
799
doneCh := make (chan struct {})
800
+ go func () {
801
+ for {
802
+ select {
803
+ case s := <- signalCh :
804
+ if err := proc .Signal (ctx , s ); err != nil {
805
+ logrus .Warnf ("failed to send signal %v %v" , s , err )
806
+ }
807
+ case w := <- resizeCh :
808
+ if err := proc .Resize (ctx , w ); err != nil {
809
+ logrus .Warnf ("failed to resize %v: %v" , w , err )
810
+ }
811
+ case <- ctx .Done ():
812
+ return
813
+ case <- doneCh :
814
+ return
815
+ }
816
+ }
817
+ }()
763
818
go func () {
764
819
defer close (doneCh )
765
820
if err := proc .Wait (); err != nil {
@@ -1016,7 +1071,7 @@ func Build(ctx context.Context, nodes []builder.Node, opt map[string]Options, do
1016
1071
return BuildWithResultHandler (ctx , nodes , opt , docker , configDir , w , nil )
1017
1072
}
1018
1073
1019
- func BuildWithResultHandler (ctx context.Context , nodes []builder.Node , opt map [string ]Options , docker * dockerutil.Client , configDir string , w progress.Writer , resultHandleFunc func (driverIndex int , rCtx * ResultContext )) (resp map [string ]* client.SolveResponse , err error ) {
1074
+ func BuildWithResultHandler (ctx context.Context , nodes []builder.Node , opt map [string ]Options , docker * dockerutil.Client , configDir string , w progress.Writer , resultHandleFunc func (driverIndex int , rCtx * ResultContext ) error ) (resp map [string ]* client.SolveResponse , err error ) {
1020
1075
if len (nodes ) == 0 {
1021
1076
return nil , errors .Errorf ("driver required for build" )
1022
1077
}
@@ -1279,7 +1334,9 @@ func BuildWithResultHandler(ctx context.Context, nodes []builder.Node, opt map[s
1279
1334
}
1280
1335
results .Set (resultKey (dp .driverIndex , k ), res )
1281
1336
if resultHandleFunc != nil {
1282
- resultHandleFunc (dp .driverIndex , & ResultContext {Client : cc , Res : res })
1337
+ if err := resultHandleFunc (dp .driverIndex , & ResultContext {Client : cc , Res : res }); err != nil {
1338
+ return nil , err
1339
+ }
1283
1340
}
1284
1341
return res , nil
1285
1342
}
0 commit comments