Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Snapshot only specific files for COPY #319

Merged
merged 2 commits into from
Aug 27, 2018
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
10 changes: 3 additions & 7 deletions pkg/commands/add.go
Original file line number Diff line number Diff line change
Expand Up @@ -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)
}
Expand Down
5 changes: 1 addition & 4 deletions pkg/commands/copy.go
Original file line number Diff line number Diff line change
Expand Up @@ -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
}
Expand Down
48 changes: 18 additions & 30 deletions pkg/util/fs_util.go
Original file line number Diff line number Diff line change
Expand Up @@ -155,21 +155,24 @@ 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()
if err == io.EOF {
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 {
Expand Down Expand Up @@ -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 {
Expand Down Expand Up @@ -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() {
Expand All @@ -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
Expand Down
15 changes: 8 additions & 7 deletions pkg/util/tar_util.go
Original file line number Diff line number Diff line change
Expand Up @@ -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)
Expand All @@ -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
Expand Down Expand Up @@ -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
}