|
@@ -4217,6 +4217,79 @@ RUN cat /existing-directory-trailing-slash/test/foo | grep Hi`
|
|
|
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
+func (s *DockerSuite) TestBuildAddBrokenTar(c *check.C) {
|
|
|
|
+ testRequires(c, DaemonIsLinux)
|
|
|
|
+ name := "testbuildaddbrokentar"
|
|
|
|
+
|
|
|
|
+ ctx := func() *FakeContext {
|
|
|
|
+ dockerfile := `
|
|
|
|
+FROM busybox
|
|
|
|
+ADD test.tar /`
|
|
|
|
+ tmpDir, err := ioutil.TempDir("", "fake-context")
|
|
|
|
+ c.Assert(err, check.IsNil)
|
|
|
|
+ testTar, err := os.Create(filepath.Join(tmpDir, "test.tar"))
|
|
|
|
+ if err != nil {
|
|
|
|
+ c.Fatalf("failed to create test.tar archive: %v", err)
|
|
|
|
+ }
|
|
|
|
+ defer testTar.Close()
|
|
|
|
+
|
|
|
|
+ tw := tar.NewWriter(testTar)
|
|
|
|
+
|
|
|
|
+ if err := tw.WriteHeader(&tar.Header{
|
|
|
|
+ Name: "test/foo",
|
|
|
|
+ Size: 2,
|
|
|
|
+ }); err != nil {
|
|
|
|
+ c.Fatalf("failed to write tar file header: %v", err)
|
|
|
|
+ }
|
|
|
|
+ if _, err := tw.Write([]byte("Hi")); err != nil {
|
|
|
|
+ c.Fatalf("failed to write tar file content: %v", err)
|
|
|
|
+ }
|
|
|
|
+ if err := tw.Close(); err != nil {
|
|
|
|
+ c.Fatalf("failed to close tar archive: %v", err)
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ // Corrupt the tar by removing one byte off the end
|
|
|
|
+ stat, err := testTar.Stat()
|
|
|
|
+ if err != nil {
|
|
|
|
+ c.Fatalf("failed to stat tar archive: %v", err)
|
|
|
|
+ }
|
|
|
|
+ if err := testTar.Truncate(stat.Size() - 1); err != nil {
|
|
|
|
+ c.Fatalf("failed to truncate tar archive: %v", err)
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ if err := ioutil.WriteFile(filepath.Join(tmpDir, "Dockerfile"), []byte(dockerfile), 0644); err != nil {
|
|
|
|
+ c.Fatalf("failed to open destination dockerfile: %v", err)
|
|
|
|
+ }
|
|
|
|
+ return fakeContextFromDir(tmpDir)
|
|
|
|
+ }()
|
|
|
|
+ defer ctx.Close()
|
|
|
|
+
|
|
|
|
+ if _, err := buildImageFromContext(name, ctx, true); err == nil {
|
|
|
|
+ c.Fatalf("build should have failed for TestBuildAddBrokenTar")
|
|
|
|
+ }
|
|
|
|
+}
|
|
|
|
+
|
|
|
|
+func (s *DockerSuite) TestBuildAddNonTar(c *check.C) {
|
|
|
|
+ testRequires(c, DaemonIsLinux)
|
|
|
|
+ name := "testbuildaddnontar"
|
|
|
|
+
|
|
|
|
+ // Should not try to extract test.tar
|
|
|
|
+ ctx, err := fakeContext(`
|
|
|
|
+ FROM busybox
|
|
|
|
+ ADD test.tar /
|
|
|
|
+ RUN test -f /test.tar`,
|
|
|
|
+ map[string]string{"test.tar": "not_a_tar_file"})
|
|
|
|
+
|
|
|
|
+ if err != nil {
|
|
|
|
+ c.Fatal(err)
|
|
|
|
+ }
|
|
|
|
+ defer ctx.Close()
|
|
|
|
+
|
|
|
|
+ if _, err := buildImageFromContext(name, ctx, true); err != nil {
|
|
|
|
+ c.Fatalf("build failed for TestBuildAddNonTar")
|
|
|
|
+ }
|
|
|
|
+}
|
|
|
|
+
|
|
func (s *DockerSuite) TestBuildAddTarXz(c *check.C) {
|
|
func (s *DockerSuite) TestBuildAddTarXz(c *check.C) {
|
|
// /test/foo is not owned by the correct user
|
|
// /test/foo is not owned by the correct user
|
|
testRequires(c, NotUserNamespace)
|
|
testRequires(c, NotUserNamespace)
|