diff --git a/remotes/docker/pusher.go b/remotes/docker/pusher.go index f7787a019..3e65832b8 100644 --- a/remotes/docker/pusher.go +++ b/remotes/docker/pusher.go @@ -230,9 +230,16 @@ func (p dockerPusher) Push(ctx context.Context, desc ocispec.Descriptor) (conten pr, pw := io.Pipe() respC := make(chan *http.Response, 1) + body := ioutil.NopCloser(pr) req.body = func() (io.ReadCloser, error) { - return ioutil.NopCloser(pr), nil + if body == nil { + return nil, errors.New("cannot reuse body, request must be retried") + } + // Only use the body once since pipe cannot be seeked + ob := body + body = nil + return ob, nil } req.size = desc.Size diff --git a/remotes/docker/resolver.go b/remotes/docker/resolver.go index d7b8627ce..7eacd08af 100644 --- a/remotes/docker/resolver.go +++ b/remotes/docker/resolver.go @@ -495,6 +495,11 @@ func (r *request) do(ctx context.Context) (*http.Response, error) { } req.Header = r.header if r.body != nil { + body, err := r.body() + if err != nil { + return nil, err + } + req.Body = body req.GetBody = r.body if r.size > 0 { req.ContentLength = r.size