diff --git a/pkg/log/log.go b/pkg/log/log.go index 553383f0..c8a8c280 100644 --- a/pkg/log/log.go +++ b/pkg/log/log.go @@ -46,6 +46,10 @@ func Infof(msg string, v ...interface{}) { addStackerLogSentinel(log.NewEntry(log.Log.(*log.Logger))).Infof(msg, v...) } +func Warnf(msg string, v ...interface{}) { + addStackerLogSentinel(log.NewEntry(log.Log.(*log.Logger))).Warnf(msg, v...) +} + func Errorf(msg string, v ...interface{}) { addStackerLogSentinel(log.NewEntry(log.Log.(*log.Logger))).Errorf(msg, v...) } diff --git a/pkg/overlay/metadata.go b/pkg/overlay/metadata.go index 3114dcf3..43906a2a 100644 --- a/pkg/overlay/metadata.go +++ b/pkg/overlay/metadata.go @@ -3,6 +3,7 @@ package overlay import ( "bytes" "encoding/json" + "io/fs" "os" "path" @@ -117,7 +118,15 @@ func (ovl overlayMetadata) lxcRootfsString(config types.StackerConfig, tag strin for _, layer := range manifest.Layers { contents := overlayPath(config.RootFSDir, layer.Digest, "overlay") if _, err := os.Stat(contents); err != nil { - return "", errors.Wrapf(err, "%s does not exist", contents) + if errors.Is(err, fs.ErrNotExist) { + // some docker layers may be empty tars, so ignore these + // https://github.com/moby/moby/issues/20917#issuecomment-191901912 + log.Warnf("%s skipping empty tar layer", layer.Digest) + + continue + } + + return "", errors.Wrapf(err, "%s unable to stat", contents) } lowerdirs = append(lowerdirs, contents) } diff --git a/test/docker-base.bats b/test/docker-base.bats index b21d1cdc..02261e2f 100644 --- a/test/docker-base.bats +++ b/test/docker-base.bats @@ -31,3 +31,13 @@ EOF umoci unpack --image oci:layer1 dest [ ! -f dest/rootfs/favicon.ico ] } + +@test "image with empty layer" { + cat > stacker.yaml <