From 62228a53357cb55fd095d5bcc4ae2ae326153444 Mon Sep 17 00:00:00 2001 From: Nalin Dahyabhai Date: Thu, 1 Apr 2021 15:15:51 -0400 Subject: [PATCH] COPY: treat absolute source paths as being relative to the contextdir Source paths for COPY that look like absolute paths are relative to the context directory, so treat them as such. Signed-off-by: Nalin Dahyabhai --- dockerclient/archive.go | 2 +- dockerclient/conformance_test.go | 15 +++++++++++++++ dockerclient/testdata/copyblahblub/Dockerfile | 4 ++++ dockerclient/testdata/copyblahblub/Dockerfile2 | 4 ++++ dockerclient/testdata/copyblahblub/Dockerfile3 | 4 ++++ .../copyblahblub/firstdir/seconddir/dir-a/file-a | 1 + .../copyblahblub/firstdir/seconddir/dir-b/file-b | 1 + 7 files changed, 30 insertions(+), 1 deletion(-) create mode 100644 dockerclient/testdata/copyblahblub/Dockerfile create mode 100644 dockerclient/testdata/copyblahblub/Dockerfile2 create mode 100644 dockerclient/testdata/copyblahblub/Dockerfile3 create mode 100644 dockerclient/testdata/copyblahblub/firstdir/seconddir/dir-a/file-a create mode 100644 dockerclient/testdata/copyblahblub/firstdir/seconddir/dir-b/file-b diff --git a/dockerclient/archive.go b/dockerclient/archive.go index 773008811..8e1096fc4 100644 --- a/dockerclient/archive.go +++ b/dockerclient/archive.go @@ -158,7 +158,7 @@ func archiveFromURL(src, dst, tempDir string, check DirectoryCheck) (io.Reader, func archiveFromDisk(directory string, src, dst string, allowDownload bool, excludes []string, check DirectoryCheck) (io.Reader, io.Closer, error) { var err error if filepath.IsAbs(src) { - src, err = filepath.Rel(filepath.Dir(src), src) + src, err = filepath.Rel(directory, filepath.Join(directory, src)) if err != nil { return nil, nil, err } diff --git a/dockerclient/conformance_test.go b/dockerclient/conformance_test.go index e20262d73..3b618814a 100644 --- a/dockerclient/conformance_test.go +++ b/dockerclient/conformance_test.go @@ -287,6 +287,21 @@ func TestConformanceInternal(t *testing.T) { Name: "copy to renamed file", ContextDir: "testdata/copyrename", }, + { + Name: "copy subdirectory 1", + ContextDir: "testdata/copyblahblub", + Dockerfile: "Dockerfile", + }, + { + Name: "copy subdirectory 2", + ContextDir: "testdata/copyblahblub", + Dockerfile: "Dockerfile2", + }, + { + Name: "copy subdirectory 3", + ContextDir: "testdata/copyblahblub", + Dockerfile: "Dockerfile3", + }, { Name: "directory with slash", ContextDir: "testdata/overlapdir", diff --git a/dockerclient/testdata/copyblahblub/Dockerfile b/dockerclient/testdata/copyblahblub/Dockerfile new file mode 100644 index 000000000..3c64a2166 --- /dev/null +++ b/dockerclient/testdata/copyblahblub/Dockerfile @@ -0,0 +1,4 @@ +FROM busybox +COPY firstdir/seconddir /var +RUN ls -la /var +RUN ls -la /var/dir-a diff --git a/dockerclient/testdata/copyblahblub/Dockerfile2 b/dockerclient/testdata/copyblahblub/Dockerfile2 new file mode 100644 index 000000000..688b352bf --- /dev/null +++ b/dockerclient/testdata/copyblahblub/Dockerfile2 @@ -0,0 +1,4 @@ +FROM busybox +COPY /firstdir/seconddir /var +RUN ls -la /var +RUN ls -la /var/dir-a diff --git a/dockerclient/testdata/copyblahblub/Dockerfile3 b/dockerclient/testdata/copyblahblub/Dockerfile3 new file mode 100644 index 000000000..2ef775512 --- /dev/null +++ b/dockerclient/testdata/copyblahblub/Dockerfile3 @@ -0,0 +1,4 @@ +FROM busybox +COPY /firstdir/seconddir/ /var +RUN ls -la /var +RUN ls -la /var/dir-a diff --git a/dockerclient/testdata/copyblahblub/firstdir/seconddir/dir-a/file-a b/dockerclient/testdata/copyblahblub/firstdir/seconddir/dir-a/file-a new file mode 100644 index 000000000..2f76e89bd --- /dev/null +++ b/dockerclient/testdata/copyblahblub/firstdir/seconddir/dir-a/file-a @@ -0,0 +1 @@ +file-a diff --git a/dockerclient/testdata/copyblahblub/firstdir/seconddir/dir-b/file-b b/dockerclient/testdata/copyblahblub/firstdir/seconddir/dir-b/file-b new file mode 100644 index 000000000..3b8ef5ab1 --- /dev/null +++ b/dockerclient/testdata/copyblahblub/firstdir/seconddir/dir-b/file-b @@ -0,0 +1 @@ +file-b