From f5f5dce318a4515dec69c1233425cdf931942371 Mon Sep 17 00:00:00 2001 From: David Scott Date: Fri, 29 Oct 2021 11:18:09 +0100 Subject: [PATCH] linuxkit: fix pkg build on Windows Previously when we set `cmd.Stderr = os.Stderr`, the stderr from buildx would be mixed with the image tar, corrupting it. Work around this (Windows-specific) problem by adding an explicit indirection via a io.Pipe() Signed-off-by: David Scott --- src/cmd/linuxkit/pkglib/docker.go | 13 ++++++++++++- 1 file changed, 12 insertions(+), 1 deletion(-) diff --git a/src/cmd/linuxkit/pkglib/docker.go b/src/cmd/linuxkit/pkglib/docker.go index 1a24eacfe..dcaccc418 100644 --- a/src/cmd/linuxkit/pkglib/docker.go +++ b/src/cmd/linuxkit/pkglib/docker.go @@ -14,6 +14,7 @@ import ( "io/ioutil" "os" "os/exec" + "runtime" "strings" versioncompare "github.com/hashicorp/go-version" @@ -80,7 +81,17 @@ func (dr *dockerRunnerImpl) command(stdin io.Reader, stdout, stderr io.Writer, a stdout = os.Stdout } if stderr == nil { - stderr = os.Stderr + if runtime.GOOS != "windows" { + stderr = os.Stderr + } else { + // On Windows directly setting stderr to os.Stderr results in the output being written to stdout, + // corrupting the image tar. Adding an explicit indirection via a pipe works around the issue. + r, w := io.Pipe() + stderr = w + go func() { + _, _ = io.Copy(os.Stderr, r) + }() + } } cmd.Stdout = stdout cmd.Stderr = stderr