diff --git a/pkg/converter/convert.go b/pkg/converter/convert.go index 571f5f3040..b03b721d2b 100644 --- a/pkg/converter/convert.go +++ b/pkg/converter/convert.go @@ -221,11 +221,13 @@ func Convert(ctx context.Context, dest io.Writer, opt ConvertOption) (io.WriteCl pr, pw := io.Pipe() + unpackDone := make(chan bool, 1) go func() { if err := unpackOciTar(ctx, sourceDir, pr); err != nil { pr.CloseWithError(errors.Wrapf(err, "unpack to %s", sourceDir)) return } + unpackDone <- true }() wc := newWriteCloser(pw, func() error { @@ -233,6 +235,11 @@ func Convert(ctx context.Context, dest io.Writer, opt ConvertOption) (io.WriteCl os.RemoveAll(workDir) }() + // Because PipeWriter#Close is called does not mean that the PipeReader + // has finished reading all the data, and unpack may not be complete yet, + // so we need to wait for that here. + <-unpackDone + bootstrapPath := filepath.Join(workDir, "bootstrap") blobPath := filepath.Join(workDir, "blob") diff --git a/pkg/converter/utils.go b/pkg/converter/utils.go index a571b4a311..8fba62945f 100644 --- a/pkg/converter/utils.go +++ b/pkg/converter/utils.go @@ -26,13 +26,16 @@ func (c *writeCloser) Close() error { if c.closed { return nil } - if err := c.action(); err != nil { - return err - } + if err := c.WriteCloser.Close(); err != nil { return err } c.closed = true + + if err := c.action(); err != nil { + return err + } + return nil }