diff --git a/pkg/executor/build.go b/pkg/executor/build.go index 88ebafe14..67c36d7d8 100644 --- a/pkg/executor/build.go +++ b/pkg/executor/build.go @@ -337,6 +337,9 @@ func DoBuild(opts *config.KanikoOptions) (v1.Image, error) { if err != nil { return nil, err } + if err := util.GetExcludedFiles(opts.SrcContext); err != nil { + return nil, err + } for index, stage := range stages { sb, err := newStageBuilder(opts, stage) if err != nil { diff --git a/pkg/util/command_util_test.go b/pkg/util/command_util_test.go index d4acfe003..c4c6fead4 100644 --- a/pkg/util/command_util_test.go +++ b/pkg/util/command_util_test.go @@ -382,6 +382,9 @@ var isSrcValidTests = []struct { func Test_IsSrcsValid(t *testing.T) { for _, test := range isSrcValidTests { t.Run(test.name, func(t *testing.T) { + if err := GetExcludedFiles(buildContextPath); err != nil { + t.Fatalf("error getting excluded files: %v", err) + } err := IsSrcsValid(test.srcsAndDest, test.resolvedSources, buildContextPath) testutil.CheckError(t, test.shouldErr, err) }) diff --git a/pkg/util/fs_util.go b/pkg/util/fs_util.go index 0f3a8ed2e..8cc912fb4 100644 --- a/pkg/util/fs_util.go +++ b/pkg/util/fs_util.go @@ -62,6 +62,8 @@ var whitelist = []WhitelistEntry{ }, } +var excluded []string + // GetFSFromImage extracts the layers of img to root // It returns a list of all files extracted func GetFSFromImage(root string, img v1.Image) ([]string, error) { @@ -549,14 +551,25 @@ func CopyFile(src, dest, buildcontext string) (bool, error) { return false, CreateFile(dest, srcFile, fi.Mode(), uid, gid) } +// GetExcludedFiles gets a list of files to exclude from the .dockerignore +func GetExcludedFiles(buildcontext string) error { + path := filepath.Join(buildcontext, ".dockerignore") + if !FilepathExists(path) { + return nil + } + contents, err := ioutil.ReadFile(path) + if err != nil { + return errors.Wrap(err, "parsing .dockerignore") + } + reader := bytes.NewBuffer(contents) + excluded, err = dockerignore.ReadAll(reader) + return err +} + // excludeFile returns true if the .dockerignore specified this file should be ignored func excludeFile(path, buildcontext string) bool { - excluded, err := parseDockerignore(buildcontext) - if err != nil { - logrus.Errorf("unable to parse dockerignore, including %s in build: %v", path, err) - return false - } if HasFilepathPrefix(path, buildcontext, false) { + var err error path, err = filepath.Rel(buildcontext, path) if err != nil { logrus.Errorf("unable to get relative path, including %s in build: %v", path, err) @@ -571,20 +584,6 @@ func excludeFile(path, buildcontext string) bool { return match } -// parseDockerignore returns a list of all paths in .dockerignore -func parseDockerignore(buildcontext string) ([]string, error) { - path := filepath.Join(buildcontext, ".dockerignore") - if !FilepathExists(path) { - return nil, nil - } - contents, err := ioutil.ReadFile(path) - if err != nil { - return nil, errors.Wrap(err, "parsing .dockerignore") - } - reader := bytes.NewBuffer(contents) - return dockerignore.ReadAll(reader) -} - // HasFilepathPrefix checks if the given file path begins with prefix func HasFilepathPrefix(path, prefix string, prefixMatchOnly bool) bool { path = filepath.Clean(path)