Merge pull request #319 from priyawadhwa/bug

Snapshot only specific files for COPY
This commit is contained in:
priyawadhwa
2018-08-27 14:00:20 -07:00
committed by GitHub
4 changed files with 30 additions and 48 deletions
+3 -7
View File
@@ -79,16 +79,12 @@ func (a *AddCommand) ExecuteCommand(config *v1.Config, buildArgs *dockerfile.Bui
a.snapshotFiles = append(a.snapshotFiles, urlDest)
} else if util.IsFileLocalTarArchive(fullPath) {
logrus.Infof("Unpacking local tar archive %s to %s", src, dest)
if err := util.UnpackLocalTarArchive(fullPath, dest); err != nil {
return err
}
// Add the unpacked files to the snapshotter
filesAdded, err := util.Files(dest)
extractedFiles, err := util.UnpackLocalTarArchive(fullPath, dest)
if err != nil {
return err
}
logrus.Debugf("Added %v from local tar archive %s", filesAdded, src)
a.snapshotFiles = append(a.snapshotFiles, filesAdded...)
logrus.Debugf("Added %v from local tar archive %s", extractedFiles, src)
a.snapshotFiles = append(a.snapshotFiles, extractedFiles...)
} else {
unresolvedSrcs = append(unresolvedSrcs, src)
}
+1 -4
View File
@@ -79,10 +79,7 @@ func (c *CopyCommand) ExecuteCommand(config *v1.Config, buildArgs *dockerfile.Bu
// we need to add '/' to the end to indicate the destination is a directory
dest = filepath.Join(cwd, dest) + "/"
}
if err := util.CopyDir(fullPath, dest); err != nil {
return err
}
copiedFiles, err := util.Files(dest)
copiedFiles, err := util.CopyDir(fullPath, dest)
if err != nil {
return err
}
+18 -30
View File
@@ -155,7 +155,9 @@ func ChildDirInWhitelist(path, directory string) bool {
return false
}
func unTar(r io.Reader, dest string) error {
// unTar returns a list of files that have been extracted from the tar archive at r to the path at dest
func unTar(r io.Reader, dest string) ([]string, error) {
var extractedFiles []string
tr := tar.NewReader(r)
for {
hdr, err := tr.Next()
@@ -163,13 +165,14 @@ func unTar(r io.Reader, dest string) error {
break
}
if err != nil {
return err
return nil, err
}
if err := extractFile(dest, hdr, tr); err != nil {
return err
return nil, err
}
extractedFiles = append(extractedFiles, dest)
}
return nil
return extractedFiles, nil
}
func extractFile(dest string, hdr *tar.Header, tr io.Reader) error {
@@ -349,24 +352,6 @@ func RelativeFiles(fp string, root string) ([]string, error) {
return files, err
}
// Files returns a list of all files rooted at root
func Files(root string) ([]string, error) {
var files []string
logrus.Debugf("Getting files and contents at root %s", root)
err := filepath.Walk(root, func(path string, info os.FileInfo, err error) error {
whitelisted, err := CheckWhitelist(path)
if err != nil {
return err
}
if whitelisted {
return nil
}
files = append(files, path)
return err
})
return files, err
}
// ParentDirectories returns a list of paths to all parent directories
// Ex. /some/temp/dir -> [/, /some, /some/temp, /some/temp/dir]
func ParentDirectories(path string) []string {
@@ -459,16 +444,18 @@ func DownloadFileToDest(rawurl, dest string) error {
}
// CopyDir copies the file or directory at src to dest
func CopyDir(src, dest string) error {
// It returns a list of files it copied over
func CopyDir(src, dest string) ([]string, error) {
files, err := RelativeFiles("", src)
if err != nil {
return err
return nil, err
}
var copiedFiles []string
for _, file := range files {
fullPath := filepath.Join(src, file)
fi, err := os.Lstat(fullPath)
if err != nil {
return err
return nil, err
}
destPath := filepath.Join(dest, file)
if fi.IsDir() {
@@ -478,24 +465,25 @@ func CopyDir(src, dest string) error {
gid := int(fi.Sys().(*syscall.Stat_t).Gid)
if err := os.MkdirAll(destPath, fi.Mode()); err != nil {
return err
return nil, err
}
if err := os.Chown(destPath, uid, gid); err != nil {
return err
return nil, err
}
} else if fi.Mode()&os.ModeSymlink != 0 {
// If file is a symlink, we want to create the same relative symlink
if err := CopySymlink(fullPath, destPath); err != nil {
return err
return nil, err
}
} else {
// ... Else, we want to copy over a file
if err := CopyFile(fullPath, destPath); err != nil {
return err
return nil, err
}
}
copiedFiles = append(copiedFiles, destPath)
}
return nil
return copiedFiles, nil
}
// CopySymlink copies the symlink at src to dest
+8 -7
View File
@@ -137,17 +137,17 @@ func (t *Tar) checkHardlink(p string, i os.FileInfo) (bool, string) {
}
// UnpackLocalTarArchive unpacks the tar archive at path to the directory dest
// Returns true if the path was actually unpacked
func UnpackLocalTarArchive(path, dest string) error {
// Returns the files extracted from the tar archive
func UnpackLocalTarArchive(path, dest string) ([]string, error) {
// First, we need to check if the path is a local tar archive
if compressed, compressionLevel := fileIsCompressedTar(path); compressed {
file, err := os.Open(path)
if err != nil {
return err
return nil, err
}
defer file.Close()
if compressionLevel == archive.Gzip {
return UnpackCompressedTar(path, dest)
return nil, UnpackCompressedTar(path, dest)
} else if compressionLevel == archive.Bzip2 {
bzr := bzip2.NewReader(file)
return unTar(bzr, dest)
@@ -156,12 +156,12 @@ func UnpackLocalTarArchive(path, dest string) error {
if fileIsUncompressedTar(path) {
file, err := os.Open(path)
if err != nil {
return err
return nil, err
}
defer file.Close()
return unTar(file, dest)
}
return errors.New("path does not lead to local tar archive")
return nil, errors.New("path does not lead to local tar archive")
}
//IsFileLocalTarArchive returns true if the file is a local tar archive
@@ -223,5 +223,6 @@ func UnpackCompressedTar(path, dir string) error {
return err
}
defer gzr.Close()
return unTar(gzr, dir)
_, err = unTar(gzr, dir)
return err
}