diff --git a/cli/command/image/build/context.go b/cli/command/image/build/context.go index b7170df88e..5d0e96737d 100644 --- a/cli/command/image/build/context.go +++ b/cli/command/image/build/context.go @@ -89,7 +89,7 @@ func ValidateContextDirectory(srcPath string, excludes []string) error { func DetectArchiveReader(input io.ReadCloser) (rc io.ReadCloser, isArchive bool, err error) { buf := bufio.NewReader(input) - magic, err := buf.Peek(archiveHeaderSize) + magic, err := buf.Peek(archiveHeaderSize * 2) if err != nil && err != io.EOF { return nil, false, errors.Errorf("failed to peek context header from STDIN: %v", err) } diff --git a/cli/command/image/build/context_test.go b/cli/command/image/build/context_test.go index d74add88b2..e0922542e7 100644 --- a/cli/command/image/build/context_test.go +++ b/cli/command/image/build/context_test.go @@ -297,3 +297,36 @@ func TestIsArchive(t *testing.T) { assert.Check(t, is.Equal(testcase.expected, IsArchive(testcase.header)), testcase.doc) } } + +func TestDetectArchiveReader(t *testing.T) { + var testcases = []struct { + file string + desc string + expected bool + }{ + { + file: "../testdata/tar.test", + desc: "tar file without pax headers", + expected: true, + }, + { + file: "../testdata/gittar.test", + desc: "tar file with pax headers", + expected: true, + }, + { + file: "../testdata/Dockerfile.test", + desc: "not a tar file", + expected: false, + }, + } + for _, testcase := range testcases { + content, err := os.Open(testcase.file) + assert.NilError(t, err) + defer content.Close() + + _, isArchive, err := DetectArchiveReader(content) + assert.NilError(t, err) + assert.Check(t, is.Equal(testcase.expected, isArchive), testcase.file) + } +} diff --git a/cli/command/image/testdata/Dockerfile.test b/cli/command/image/testdata/Dockerfile.test new file mode 100644 index 0000000000..5b54d9b40e --- /dev/null +++ b/cli/command/image/testdata/Dockerfile.test @@ -0,0 +1,3 @@ +FROM busybox +ADD ./README.md / +CMD ["cat", "/README.md"] diff --git a/cli/command/image/testdata/gittar.test b/cli/command/image/testdata/gittar.test new file mode 100644 index 0000000000..86ccb3187b Binary files /dev/null and b/cli/command/image/testdata/gittar.test differ diff --git a/cli/command/image/testdata/tar.test b/cli/command/image/testdata/tar.test new file mode 100644 index 0000000000..bfb856a6d2 Binary files /dev/null and b/cli/command/image/testdata/tar.test differ