diff --git a/distribution/pull_v1.go b/distribution/pull_v1.go index a8ae624915..86fad2ef7a 100644 --- a/distribution/pull_v1.go +++ b/distribution/pull_v1.go @@ -330,7 +330,20 @@ func (ld *v1LayerDescriptor) Download(ctx context.Context, progressOutput progre logrus.Debugf("Downloaded %s to tempfile %s", ld.ID(), ld.tmpFile.Name()) ld.tmpFile.Seek(0, 0) - return ld.tmpFile, ld.layerSize, nil + + // hand off the temporary file to the download manager, so it will only + // be closed once + tmpFile := ld.tmpFile + ld.tmpFile = nil + + return ioutils.NewReadCloserWrapper(tmpFile, func() error { + tmpFile.Close() + err := os.RemoveAll(tmpFile.Name()) + if err != nil { + logrus.Errorf("Failed to remove temp file: %s", tmpFile.Name()) + } + return err + }), ld.layerSize, nil } func (ld *v1LayerDescriptor) Close() { diff --git a/distribution/pull_v2.go b/distribution/pull_v2.go index 596d1c1321..ecddc170b7 100644 --- a/distribution/pull_v2.go +++ b/distribution/pull_v2.go @@ -278,7 +278,19 @@ func (ld *v2LayerDescriptor) Download(ctx context.Context, progressOutput progre ld.verifier = nil return nil, 0, xfer.DoNotRetry{Err: err} } - return tmpFile, size, nil + + // hand off the temporary file to the download manager, so it will only + // be closed once + ld.tmpFile = nil + + return ioutils.NewReadCloserWrapper(tmpFile, func() error { + tmpFile.Close() + err := os.RemoveAll(tmpFile.Name()) + if err != nil { + logrus.Errorf("Failed to remove temp file: %s", tmpFile.Name()) + } + return err + }), size, nil } func (ld *v2LayerDescriptor) Close() {