diff --git a/pkg/driver/custom/custom.go b/pkg/driver/custom/custom.go index 218409750..fa08b2b08 100644 --- a/pkg/driver/custom/custom.go +++ b/pkg/driver/custom/custom.go @@ -7,6 +7,7 @@ import ( "fmt" "io" "strings" + "time" "github.com/loft-sh/devpod/pkg/agent" "github.com/loft-sh/devpod/pkg/binaries" @@ -16,6 +17,7 @@ import ( provider2 "github.com/loft-sh/devpod/pkg/provider" "github.com/loft-sh/devpod/pkg/types" "github.com/loft-sh/log" + "github.com/loft-sh/log/scanner" "github.com/sirupsen/logrus" ) @@ -202,9 +204,16 @@ func (c *customDriver) RunDevContainer(ctx context.Context, workspaceId string, return fmt.Errorf("marshal run options: %w", err) } - // create a log writer - writer := c.log.Writer(logrus.InfoLevel, false) + done := make(chan struct{}) + reader, writer := io.Pipe() defer writer.Close() + go func() { + scan := scanner.NewScanner(reader) + for scan.Scan() { + c.log.Info(scan.Text()) + } + done <- struct{}{} + }() // run command err = c.runCommand( @@ -221,6 +230,13 @@ func (c *customDriver) RunDevContainer(ctx context.Context, workspaceId string, c.log, ) if err != nil { + // close writer, wait for logging to flush and shut down + writer.Close() + select { + case <-done: + // forcibly shut down after 1 second + case <-time.After(1 * time.Second): + } return fmt.Errorf("error running devcontainer: %w", err) }