diff --git a/pkg/executor/build.go b/pkg/executor/build.go index d55c0a875..cef20d233 100644 --- a/pkg/executor/build.go +++ b/pkg/executor/build.go @@ -563,7 +563,6 @@ func DoBuild(opts *config.KanikoOptions) (v1.Image, error) { } } - // filesToSave, err := filesToSave(crossStageDependencies[index]) if err != nil { return nil, err @@ -599,7 +598,7 @@ func filesToSave(deps []string) ([]string, error) { return nil, err } for _, f := range srcs { - if link, err := util.CanonicalizeLink(f); err == nil { + if link, err := util.EvalSymLink(f); err == nil { symLinks = append(symLinks, f) srcFiles = append(srcFiles, link) } else { diff --git a/pkg/snapshot/snapshot.go b/pkg/snapshot/snapshot.go index fe2eead8f..e26413cc4 100644 --- a/pkg/snapshot/snapshot.go +++ b/pkg/snapshot/snapshot.go @@ -19,6 +19,7 @@ package snapshot import ( "fmt" "io/ioutil" + "os" "path/filepath" "sort" "syscall" @@ -197,7 +198,6 @@ func (s *Snapshotter) scanFullFilesystem() ([]string, []string, error) { return nil, nil, fmt.Errorf("unable to add file %s to layered map: %s", file, err) } } - return filesToAdd, filesToWhiteOut, nil } @@ -240,11 +240,18 @@ func filesWithParentDirs(files []string) []string { } func filesWithLinks(path string) ([]string, error) { - link, err := util.CanonicalizeLink(path) + link, err := util.GetSymLink(path) if err == util.ErrNotSymLink { return []string{path}, nil } else if err != nil { return nil, err } + // Add symlink if it exists in the FS + if !filepath.IsAbs(link) { + link = filepath.Join(filepath.Dir(path), link) + } + if _, err := os.Stat(link); err != nil { + return []string{path}, nil + } return []string{path, link}, nil } diff --git a/pkg/util/fs_util.go b/pkg/util/fs_util.go index b2c8e2ca0..2b5797bc1 100644 --- a/pkg/util/fs_util.go +++ b/pkg/util/fs_util.go @@ -506,6 +506,7 @@ func CopyDir(src, dest, buildcontext string) ([]string, error) { fullPath := filepath.Join(src, file) fi, err := os.Lstat(fullPath) if err != nil { + fmt.Println(" i am returning from here this", err) return nil, err } if excludeFile(fullPath, buildcontext) { @@ -545,7 +546,7 @@ func CopySymlink(src, dest, buildcontext string) (bool, error) { logrus.Debugf("%s found in .dockerignore, ignoring", src) return true, nil } - link, err := filepath.EvalSymlinks(src) + link, err := os.Readlink(src) if err != nil { return false, err } @@ -693,17 +694,31 @@ func IsSymlink(fi os.FileInfo) bool { var ErrNotSymLink = fmt.Errorf("not a symlink") -func CanonicalizeLink(path string) (string, error) { - fi, err := os.Lstat(path) - if err != nil { +func GetSymLink(path string) (string, error) { + if err := getSymlink(path); err != nil { + return "", err + } + return os.Readlink(path) +} + +func EvalSymLink(path string) (string, error) { + if err := getSymlink(path); err != nil { return "", err } - if !IsSymlink(fi) { - return "", ErrNotSymLink - } return filepath.EvalSymlinks(path) } +func getSymlink(path string) error { + fi, err := os.Lstat(path) + if err != nil { + return err + } + if !IsSymlink(fi) { + return ErrNotSymLink + } + return nil +} + // otiai10Cpy.Copy in case the src file is a symlink, will copy the target // file at destination instead of creating a symlink. See #915 for more details. func CopyFileOrSymlink(src string, destDir string) error {