Flush stdin from within chroot archive

This makes sure that we don't buffer in memory and that we also flush
stdin from diff as well as untar.

Signed-off-by: Michael Crosby <crosbymichael@gmail.com>

Conflicts:
	pkg/chrootarchive/diff.go
This commit is contained in:
Michael Crosby 2014-12-08 15:04:34 -08:00 committed by Tibor Vass
parent a8124280d2
commit cd74be68b8
4 changed files with 27 additions and 4 deletions

View file

@ -6,7 +6,6 @@ import (
"flag"
"fmt"
"io"
"io/ioutil"
"os"
"path/filepath"
"runtime"
@ -40,9 +39,7 @@ func untar() {
fatal(err)
}
// fully consume stdin in case it is zero padded
if _, err := ioutil.ReadAll(os.Stdin); err != nil {
fatal(err)
}
flush(os.Stdin)
os.Exit(0)
}

View file

@ -83,3 +83,19 @@ func TestChrootUntarEmptyArchiveFromSlowReader(t *testing.T) {
t.Fatal(err)
}
}
func TestChrootApplyEmptyArchiveFromSlowReader(t *testing.T) {
tmpdir, err := ioutil.TempDir("", "docker-TestChrootApplyEmptyArchiveFromSlowReader")
if err != nil {
t.Fatal(err)
}
defer os.RemoveAll(tmpdir)
dest := filepath.Join(tmpdir, "dest")
if err := os.MkdirAll(dest, 0700); err != nil {
t.Fatal(err)
}
stream := &slowEmptyTarReader{size: 10240, chunkSize: 1024}
if err := ApplyLayer(dest, stream); err != nil {
t.Fatal(err)
}
}

View file

@ -34,6 +34,8 @@ func applyLayer() {
if err != nil {
fatal(err)
}
os.RemoveAll(tmpDir)
flush(os.Stdin)
os.Exit(0)
}

View file

@ -2,6 +2,8 @@ package chrootarchive
import (
"fmt"
"io"
"io/ioutil"
"os"
"github.com/docker/docker/pkg/reexec"
@ -16,3 +18,9 @@ func fatal(err error) {
fmt.Fprint(os.Stderr, err)
os.Exit(1)
}
// flush consumes all the bytes from the reader discarding
// any errors
func flush(r io.Reader) {
io.Copy(ioutil.Discard, r)
}