@@ -17,7 +17,6 @@ import (
1717 "time"
1818
1919 "github.com/docker/docker/builder/remotecontext/git"
20- "github.com/docker/docker/pkg/ioutils"
2120 "github.com/docker/docker/pkg/progress"
2221 "github.com/docker/docker/pkg/streamformatter"
2322 "github.com/moby/go-archive"
@@ -109,7 +108,7 @@ func DetectArchiveReader(input io.ReadCloser) (rc io.ReadCloser, isArchive bool,
109108 return nil , false , errors .Errorf ("failed to peek context header from STDIN: %v" , err )
110109 }
111110
112- return ioutils . NewReadCloserWrapper (buf , func () error { return input .Close () }), IsArchive (magic ), nil
111+ return newReadCloserWrapper (buf , func () error { return input .Close () }), IsArchive (magic ), nil
113112}
114113
115114// WriteTempDockerfile writes a Dockerfile stream to a temporary file with a
@@ -170,7 +169,7 @@ func GetContextFromReader(rc io.ReadCloser, dockerfileName string) (out io.ReadC
170169 return nil , "" , err
171170 }
172171
173- return ioutils . NewReadCloserWrapper (tarArchive , func () error {
172+ return newReadCloserWrapper (tarArchive , func () error {
174173 err := tarArchive .Close ()
175174 os .RemoveAll (dockerfileDir )
176175 return err
@@ -228,7 +227,7 @@ func GetContextFromURL(out io.Writer, remoteURL, dockerfileName string) (io.Read
228227 // Pass the response body through a progress reader.
229228 progReader := progress .NewProgressReader (response .Body , progressOutput , response .ContentLength , "" , "Downloading build context from remote url: " + remoteURL )
230229
231- return GetContextFromReader (ioutils . NewReadCloserWrapper (progReader , func () error { return response .Body .Close () }), dockerfileName )
230+ return GetContextFromReader (newReadCloserWrapper (progReader , func () error { return response .Body .Close () }), dockerfileName )
232231}
233232
234233// getWithStatusError does an http.Get() and returns an error if the
@@ -454,3 +453,25 @@ func Compress(buildCtx io.ReadCloser) (io.ReadCloser, error) {
454453
455454 return pipeReader , nil
456455}
456+
457+ // readCloserWrapper wraps an io.Reader, and implements an io.ReadCloser
458+ // It calls the given callback function when closed. It should be constructed
459+ // with [newReadCloserWrapper].
460+ type readCloserWrapper struct {
461+ io.Reader
462+ closer func () error
463+ }
464+
465+ // Close calls back the passed closer function
466+ func (r * readCloserWrapper ) Close () error {
467+ return r .closer ()
468+ }
469+
470+ // newReadCloserWrapper wraps an io.Reader, and implements an io.ReadCloser.
471+ // It calls the given callback function when closed.
472+ func newReadCloserWrapper (r io.Reader , closer func () error ) io.ReadCloser {
473+ return & readCloserWrapper {
474+ Reader : r ,
475+ closer : closer ,
476+ }
477+ }
0 commit comments