Skip to content

Commit

Permalink
Skip the /kaniko directory when copying root (#2863)
Browse files Browse the repository at this point in the history
This commit adds the skip option for otiai10.Copy to skip the /kaniko
directory when the root is being copied. The files under /kaniko dir
should be ignored and thus this shall not cause any loss of information.

fixes: #2033
  • Loading branch information
JeromeJu authored Nov 29, 2023
1 parent e479111 commit 9e59549
Show file tree
Hide file tree
Showing 3 changed files with 48 additions and 1 deletion.
5 changes: 5 additions & 0 deletions integration/dockerfiles/Dockerfile_test_copy_root_multistage
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
FROM busybox:1.31
COPY context/foo foo

FROM alpine@sha256:5ce5f501c457015c4b91f91a15ac69157d9b06f1a75cf9107bf2b62e0843983a
COPY / /foo
35 changes: 35 additions & 0 deletions pkg/executor/copy_multistage_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -100,6 +100,7 @@ COPY --from=first copied/bam.txt output/`
testutil.CheckDeepEqual(t, 1, len(files))
testutil.CheckDeepEqual(t, files[0].Name(), "bam.txt")
})

t.Run("copy directory across multistage into a directory", func(t *testing.T) {
testDir, fn := setupMultistageTests(t)
defer fn()
Expand Down Expand Up @@ -135,6 +136,40 @@ COPY --from=first copied another`
//testutil.CheckDeepEqual(t, linkName, "bam.txt")
})

t.Run("copy root across multistage", func(t *testing.T) {
testDir, fn := setupMultistageTests(t)
defer fn()
dockerFile := `
FROM scratch as first
COPY foo copied
ENV test test
From scratch as second
COPY --from=first / output/`
ioutil.WriteFile(filepath.Join(testDir, "workspace", "Dockerfile"), []byte(dockerFile), 0755)

Check failure on line 149 in pkg/executor/copy_multistage_test.go

View workflow job for this annotation

GitHub Actions / tests

undefined: ioutil
opts := &config.KanikoOptions{
DockerfilePath: filepath.Join(testDir, "workspace", "Dockerfile"),
SrcContext: filepath.Join(testDir, "workspace"),
SnapshotMode: constants.SnapshotModeFull,
}
_, err := DoBuild(opts)
testutil.CheckNoError(t, err)

filesUnderRoot, err := ioutil.ReadDir(filepath.Join(testDir, "output/"))

Check failure on line 158 in pkg/executor/copy_multistage_test.go

View workflow job for this annotation

GitHub Actions / tests

undefined: ioutil
if err != nil {
t.Fatal(err)
}
testutil.CheckDeepEqual(t, 3, len(filesUnderRoot))

files, err := ioutil.ReadDir(filepath.Join(testDir, "output/workspace/foo"))

Check failure on line 164 in pkg/executor/copy_multistage_test.go

View workflow job for this annotation

GitHub Actions / tests

undefined: ioutil
if err != nil {
t.Fatal(err)
}
testutil.CheckDeepEqual(t, 2, len(files))
testutil.CheckDeepEqual(t, "bam.link", files[0].Name())
testutil.CheckDeepEqual(t, "bam.txt", files[1].Name())
})

}

func setupMultistageTests(t *testing.T) (string, func()) {
Expand Down
9 changes: 8 additions & 1 deletion pkg/util/fs_util.go
Original file line number Diff line number Diff line change
Expand Up @@ -80,6 +80,13 @@ var ignorelist = append([]IgnoreListEntry{}, defaultIgnoreList...)

var volumes = []string{}

// skipKanikoDir opts to skip the '/kaniko' dir for otiai10.copy which should be ignored in root
var skipKanikoDir = otiai10Cpy.Options{
Skip: func(info os.FileInfo, src, dest string) (bool, error) {
return strings.HasSuffix(src, "/kaniko"), nil
},
}

type FileContext struct {
Root string
ExcludedFiles []string
Expand Down Expand Up @@ -955,7 +962,7 @@ func CopyFileOrSymlink(src string, destDir string, root string) error {
}
return os.Symlink(link, destFile)
}
if err := otiai10Cpy.Copy(src, destFile); err != nil {
if err := otiai10Cpy.Copy(src, destFile, skipKanikoDir); err != nil {
return errors.Wrap(err, "copying file")
}
if err := CopyOwnership(src, destDir, root); err != nil {
Expand Down

0 comments on commit 9e59549

Please sign in to comment.