Only add whiteout files once (#270)

* Only add whiteout files once

* Updated vars
This commit is contained in:
priyawadhwa 2018-08-01 17:27:20 -07:00 committed by GitHub
parent 8a2492d241
commit 71c83e369c
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
3 changed files with 38 additions and 10 deletions

View File

@ -1,3 +1,4 @@
FROM busybox@sha256:1bd6df27274fef1dd36eb529d0f4c8033f61c675d6b04213dd913f902f7cafb5 FROM busybox@sha256:1bd6df27274fef1dd36eb529d0f4c8033f61c675d6b04213dd913f902f7cafb5
ADD context/tars /tmp/tars ADD context/tars /tmp/tars
RUN mv /tmp/tars /foo RUN mv /tmp/tars /foo
RUN echo "hi"

View File

@ -23,6 +23,7 @@ import (
type LayeredMap struct { type LayeredMap struct {
layers []map[string]string layers []map[string]string
whiteouts []map[string]string
hasher func(string) (string, error) hasher func(string) (string, error)
} }
@ -35,6 +36,7 @@ func NewLayeredMap(h func(string) (string, error)) *LayeredMap {
} }
func (l *LayeredMap) Snapshot() { func (l *LayeredMap) Snapshot() {
l.whiteouts = append(l.whiteouts, map[string]string{})
l.layers = append(l.layers, map[string]string{}) l.layers = append(l.layers, map[string]string{})
} }
@ -62,6 +64,24 @@ func (l *LayeredMap) Get(s string) (string, bool) {
return "", false return "", false
} }
func (l *LayeredMap) GetWhiteout(s string) (string, bool) {
for i := len(l.whiteouts) - 1; i >= 0; i-- {
if v, ok := l.whiteouts[i][s]; ok {
return v, ok
}
}
return "", false
}
func (l *LayeredMap) MaybeAddWhiteout(s string) (bool, error) {
whiteout, ok := l.GetWhiteout(s)
if ok && whiteout == s {
return false, nil
}
l.whiteouts[len(l.whiteouts)-1][s] = s
return true, nil
}
func (l *LayeredMap) MaybeAdd(s string) (bool, error) { func (l *LayeredMap) MaybeAdd(s string) (bool, error) {
oldV, ok := l.Get(s) oldV, ok := l.Get(s)
newV, err := l.hasher(s) newV, err := l.hasher(s)

View File

@ -19,12 +19,13 @@ package snapshot
import ( import (
"archive/tar" "archive/tar"
"bytes" "bytes"
"github.com/GoogleContainerTools/kaniko/pkg/util"
"github.com/sirupsen/logrus"
"io" "io"
"io/ioutil" "io/ioutil"
"os" "os"
"path/filepath" "path/filepath"
"github.com/GoogleContainerTools/kaniko/pkg/util"
"github.com/sirupsen/logrus"
) )
// Snapshotter holds the root directory from which to take snapshots, and a list of snapshots taken // Snapshotter holds the root directory from which to take snapshots, and a list of snapshots taken
@ -103,11 +104,11 @@ func (s *Snapshotter) snapshotFiles(f io.Writer, files []string) (bool, error) {
return false, err return false, err
} }
// Only add to the tar if we add it to the layeredmap. // Only add to the tar if we add it to the layeredmap.
maybeAdd, err := s.l.MaybeAdd(file) addFile, err := s.l.MaybeAdd(file)
if err != nil { if err != nil {
return false, err return false, err
} }
if maybeAdd { if addFile {
filesAdded = true filesAdded = true
if err := util.AddToTar(file, info, s.hardlinks, w); err != nil { if err := util.AddToTar(file, info, s.hardlinks, w); err != nil {
return false, err return false, err
@ -141,6 +142,11 @@ func (s *Snapshotter) snapShotFS(f io.Writer) (bool, error) {
// Only add the whiteout if the directory for the file still exists. // Only add the whiteout if the directory for the file still exists.
dir := filepath.Dir(path) dir := filepath.Dir(path)
if _, ok := memFs[dir]; ok { if _, ok := memFs[dir]; ok {
addWhiteout, err := s.l.MaybeAddWhiteout(path)
if err != nil {
return false, nil
}
if addWhiteout {
logrus.Infof("Adding whiteout for %s", path) logrus.Infof("Adding whiteout for %s", path)
filesAdded = true filesAdded = true
if err := util.Whiteout(path, w); err != nil { if err := util.Whiteout(path, w); err != nil {
@ -148,6 +154,7 @@ func (s *Snapshotter) snapShotFS(f io.Writer) (bool, error) {
} }
} }
} }
}
// Now create the tar. // Now create the tar.
for path, info := range memFs { for path, info := range memFs {