Skip to content

Copy with exclude pattern using too broad cache key #6233

@tonistiigi

Description

@tonistiigi

While testing #6220 I discovered that:

FROM alpine as stage1
RUN mkdir /test && touch /test/foo

FROM alpine
COPY --from=stage1 /test /test

creates cache key

sha256:6d7c9b907a8463e3f17e22f00d78c918ecba6656d6ae26069fb6422970285993 (file-list):
  sha256:1a2805521573cb10d73bcd51d16bfa84c8f461d68599740e35484b90b2ab1bab (file):
  sha256:700591407496206b27e3739e92128dd4d3a119e929d3b3677835a1ab6627aa3d (file):
  data:
  data: sha256:1a2805521573cb10d73bcd51d16bfa84c8f461d68599740e35484b90b2ab1bab
  data: foo
  data: sha256:700591407496206b27e3739e92128dd4d3a119e929d3b3677835a1ab6627aa3d

sha256:1a2805521573cb10d73bcd51d16bfa84c8f461d68599740e35484b90b2ab1bab (file):
  data: name
  data: mode493
  data: uid0
  data: gid0
  data: size0
  data: typeflag5
  data: linkname
  data: uname
  data: gname
  data: devmajor0
  data: devminor0

sha256:700591407496206b27e3739e92128dd4d3a119e929d3b3677835a1ab6627aa3d (file):
  data: name
  data: mode420
  data: uid0
  data: gid0
  data: size0
  data: typeflag0
  data: linkname
  data: uname
  data: gname
  data: devmajor0
  data: devminor0

while if I add exclude rule that doesn't match anything

FROM alpine as stage1
RUN mkdir /test && touch /test/foo

FROM alpine
COPY --from=stage1 --exclude=*.git /test /test

I get

sha256:6ec7685f0a195ff364bceb348451b93cad9cfd804dfe689dcdc55335fae5bae4 (file-list):
  sha256:1a2805521573cb10d73bcd51d16bfa84c8f461d68599740e35484b90b2ab1bab (file):
  sha256:700591407496206b27e3739e92128dd4d3a119e929d3b3677835a1ab6627aa3d (file):
  data: test
  data: sha256:1a2805521573cb10d73bcd51d16bfa84c8f461d68599740e35484b90b2ab1bab
  data:
  data: foo
  data: sha256:700591407496206b27e3739e92128dd4d3a119e929d3b3677835a1ab6627aa3d

sha256:1a2805521573cb10d73bcd51d16bfa84c8f461d68599740e35484b90b2ab1bab (file):
  data: name
  data: mode493
  data: uid0
  data: gid0
  data: size0
  data: typeflag5
  data: linkname
  data: uname
  data: gname
  data: devmajor0
  data: devminor0

sha256:700591407496206b27e3739e92128dd4d3a119e929d3b3677835a1ab6627aa3d (file):
  data: name
  data: mode420
  data: uid0
  data: gid0
  data: size0
  data: typeflag0
  data: linkname
  data: uname
  data: gname
  data: devmajor0
  data: devminor0

Note that "test" (the parent directory name) is not part of the first cache key. I don't immediately see any reason why it should be part of the second one.

This means that 1) adding no-op exclude rule invalidates cache 2) changing the name of the parent directory that isn't part of the copied files invalidates cache if exclude patterns(or possible include patterns as well) are set.

Metadata

Metadata

Assignees

No one assigned

    Labels

    Type

    No type

    Projects

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions