build: fix issues with leaving invoke containers running

Signed-off-by: Tonis Tiigi <tonistiigi@gmail.com>
This commit is contained in:
Tonis Tiigi 2022-08-07 22:16:14 -07:00
parent 17dc0e1108
commit 75ddc5b811
2 changed files with 24 additions and 6 deletions

View File

@ -643,7 +643,16 @@ func Invoke(ctx context.Context, cfg ContainerConfig) error {
return errors.Errorf("result must be provided") return errors.Errorf("result must be provided")
} }
c, res := cfg.ResultCtx.Client, cfg.ResultCtx.Res c, res := cfg.ResultCtx.Client, cfg.ResultCtx.Res
_, err := c.Build(ctx, client.SolveOpt{}, "buildx", func(ctx context.Context, c gateway.Client) (*gateway.Result, error) {
mainCtx := ctx
_, err := c.Build(context.TODO(), client.SolveOpt{}, "buildx", func(ctx context.Context, c gateway.Client) (*gateway.Result, error) {
ctx, cancel := context.WithCancel(ctx)
go func() {
<-mainCtx.Done()
cancel()
}()
if res.Ref == nil { if res.Ref == nil {
return nil, errors.Errorf("no reference is registered") return nil, errors.Errorf("no reference is registered")
} }
@ -673,7 +682,8 @@ func Invoke(ctx context.Context, cfg ContainerConfig) error {
if err != nil { if err != nil {
return nil, err return nil, err
} }
defer ctr.Release(ctx) defer ctr.Release(context.TODO())
proc, err := ctr.Start(ctx, gateway.StartRequest{ proc, err := ctr.Start(ctx, gateway.StartRequest{
Args: cfg.Args, Args: cfg.Args,
Env: cfg.Env, Env: cfg.Env,

View File

@ -52,10 +52,8 @@ func RunMonitor(ctx context.Context, containerConfig build.ContainerConfig, relo
} }
// Start container automatically // Start container automatically
go func() {
fmt.Fprintf(stdout, "Launching interactive container. Press Ctrl-a-c to switch to monitor console\n") fmt.Fprintf(stdout, "Launching interactive container. Press Ctrl-a-c to switch to monitor console\n")
m.rollback(ctx, containerConfig) m.rollback(ctx, containerConfig)
}()
// Serve monitor commands // Serve monitor commands
monitorForwarder := newIOForwarder(monitorIn) monitorForwarder := newIOForwarder(monitorIn)
@ -67,6 +65,10 @@ func RunMonitor(ctx context.Context, containerConfig build.ContainerConfig, relo
go func() { go func() {
defer close(doneCh) defer close(doneCh)
defer in.Close() defer in.Close()
go func() {
<-ctx.Done()
in.Close()
}()
t := term.NewTerminal(readWriter{in.stdin, in.stdout}, "(buildx) ") t := term.NewTerminal(readWriter{in.stdin, in.stdout}, "(buildx) ")
for { for {
l, err := t.ReadLine() l, err := t.ReadLine()
@ -105,8 +107,14 @@ func RunMonitor(ctx context.Context, containerConfig build.ContainerConfig, relo
}() }()
select { select {
case <-doneCh: case <-doneCh:
if m.curInvokeCancel != nil {
m.curInvokeCancel()
}
return nil return nil
case err := <-errCh: case err := <-errCh:
if m.curInvokeCancel != nil {
m.curInvokeCancel()
}
return err return err
case <-monitorDisableCh: case <-monitorDisableCh:
} }