diff --git a/src/moby/docker.go b/src/moby/docker.go index 640cf8119..296a61108 100644 --- a/src/moby/docker.go +++ b/src/moby/docker.go @@ -4,7 +4,6 @@ package moby // and also using the Docker API not shelling out import ( - "bytes" "errors" "fmt" "io" @@ -81,25 +80,18 @@ func dockerCreate(image string) (string, error) { return respBody.ID, nil } -func dockerExport(container string) ([]byte, error) { +func dockerExport(container string) (io.ReadCloser, error) { log.Debugf("docker export: %s", container) cli, err := dockerClient() if err != nil { - return []byte{}, errors.New("could not initialize Docker API client") + return nil, errors.New("could not initialize Docker API client") } responseBody, err := cli.ContainerExport(context.Background(), container) if err != nil { - return []byte{}, err - } - defer responseBody.Close() - - output := bytes.NewBuffer(nil) - _, err = io.Copy(output, responseBody) - if err != nil { - return []byte{}, err + return nil, err } - return output.Bytes(), nil + return responseBody, err } func dockerRm(container string) error { diff --git a/src/moby/image.go b/src/moby/image.go index 9f2a3504e..3b3426ebe 100644 --- a/src/moby/image.go +++ b/src/moby/image.go @@ -119,6 +119,8 @@ func ImageTar(ref *reference.Spec, prefix string, tw tarWriter, trust bool, pull if err != nil { return fmt.Errorf("Failed to docker export container from container %s: %v", container, err) } + defer contents.Close() + err = dockerRm(container) if err != nil { return fmt.Errorf("Failed to docker rm container %s: %v", container, err) @@ -126,8 +128,7 @@ func ImageTar(ref *reference.Spec, prefix string, tw tarWriter, trust bool, pull // now we need to filter out some files from the resulting tar archive - r := bytes.NewReader(contents) - tr := tar.NewReader(r) + tr := tar.NewReader(contents) for { hdr, err := tr.Next()