@@ -677,6 +677,12 @@ type ContainerConfig struct {
677677 Cwd * string
678678
679679 Initial bool
680+
681+ SignalCh <- chan syscall.Signal
682+ ResizeCh <- chan gateway.WinSize
683+
684+ Image string
685+ ResultMountPath string
680686}
681687
682688// ResultContext is a build result with the client that built it.
@@ -748,6 +754,29 @@ func Invoke(ctx context.Context, cfg ContainerConfig) error {
748754 containerCfg , processCfg = * ccfg , * pcfg
749755 }
750756
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+
751780 ctr , err := c .NewContainer (ctx , containerCfg )
752781 if err != nil {
753782 return nil , err
@@ -758,8 +787,34 @@ func Invoke(ctx context.Context, cfg ContainerConfig) error {
758787 if err != nil {
759788 return nil , errors .Errorf ("failed to start container: %v" , err )
760789 }
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+ }
761798 errCh := make (chan error )
762799 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+ }()
763818 go func () {
764819 defer close (doneCh )
765820 if err := proc .Wait (); err != nil {
@@ -1016,7 +1071,7 @@ func Build(ctx context.Context, nodes []builder.Node, opt map[string]Options, do
10161071 return BuildWithResultHandler (ctx , nodes , opt , docker , configDir , w , nil )
10171072}
10181073
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 ) {
10201075 if len (nodes ) == 0 {
10211076 return nil , errors .Errorf ("driver required for build" )
10221077 }
@@ -1279,7 +1334,9 @@ func BuildWithResultHandler(ctx context.Context, nodes []builder.Node, opt map[s
12791334 }
12801335 results .Set (resultKey (dp .driverIndex , k ), res )
12811336 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+ }
12831340 }
12841341 return res , nil
12851342 }
0 commit comments