create correct link across Multistage builds

This commit is contained in:
Tejal Desai 2020-03-07 11:28:16 -08:00
parent c523c691eb
commit 2181c5e6f5
3 changed files with 11 additions and 22 deletions

View File

@ -1,14 +1,10 @@
FROM busybox as t
RUN echo "hello" > /tmp/target
RUN ln -s /tmp/target /tmp/link
## Relative link
RUN cd tmp && ln -s target relative_link
RUN mkdir temp
RUN echo "hello" > temp/target
RUN ln -s target temp/link
## Relative link with paths
RUN mkdir workdir && cd workdir && ln -s ../tmp/target relative_dir_link
RUN mkdir workdir && cd workdir && ln -s ../temp/target relative_link
FROM scratch
COPY --from=t /tmp/link /tmp/
COPY --from=t /tmp/relative_link /tmp/
COPY --from=t /workdir/relative_dir_link /workdir/
COPY --from=t temp/ dest/
COPY --from=t /workdir/relative_link /workdirAnother/

View File

@ -35,6 +35,7 @@ import (
// * Add all ancestors of each path to the output set.
func ResolvePaths(paths []string, wl []util.WhitelistEntry) (pathsToAdd []string, err error) {
logrus.Info("Resolving paths")
logrus.Debugf("Resolving paths %s", paths)
fileSet := make(map[string]bool)

View File

@ -442,7 +442,7 @@ func DetectFilesystemWhitelist(path string) error {
func RelativeFiles(fp string, root string) ([]string, error) {
var files []string
fullPath := filepath.Join(root, fp)
logrus.Debugf("Getting files and contents at root %s", fullPath)
logrus.Debugf("Getting files and contents at root %s for %s", root, fullPath)
err := filepath.Walk(fullPath, func(path string, info os.FileInfo, err error) error {
if err != nil {
return err
@ -609,14 +609,7 @@ func CopyDir(src, dest, buildcontext string, uid, gid int64) ([]string, error) {
return copiedFiles, nil
}
// CopySymlink copies the symlink at src to dest
// if asSymlink is true, then the file is copied as symlink. This is done for a symlink file in the directory is copied
// COPY src/ dest/
// where src/ contains a symlink file.
// if asSymlink is false, then target file of the symlink is copied as a regular file.
// This done when copying a single file via
// COPY sym.link dest
// where sym.link is a link to target file.
// CopySymlink copies the symlink at src to dest along with the regular file.
func CopySymlink(src, dest, buildcontext string, uid int64, gid int64) (bool, string, error) {
if ExcludeFile(src, buildcontext) {
logrus.Debugf("%s found in .dockerignore, ignoring", src)
@ -842,15 +835,14 @@ func getSymlink(path string) error {
func CopyFileOrSymlink(src string, destDir string) error {
destFile := filepath.Join(destDir, src)
if fi, _ := os.Lstat(src); IsSymlink(fi) {
link, err := EvalSymLink(src)
link, err := os.Readlink(src)
if err != nil {
return err
}
linkPath := filepath.Join(destDir, link)
if err := createParentDirectory(destFile); err != nil {
return err
}
return os.Symlink(linkPath, destFile)
return os.Symlink(link, destFile)
}
return otiai10Cpy.Copy(src, destFile)
}