https://github.com/opencontainers/image-spec/issues/821
Proposed Standard Annotations:
(matches the format of "org.opencontainers.image.ref.name Name of the reference for a target (string).")
https://github.com/opencontainers/image-spec/blob/master/annotations.md
"Am I vulnerable?"
Registries can identify images based on known-vulnerable base images, notify/advise users that they are vulnerable.
"Do I need a rebuild?" (for whatever reason)
Either proactive (scan for images in need of a rebuild), or just-in-time (before docker build
, do I need this?)
In certain constrained cases (e.g., Buildpacks), rebuild can be avoided and base image layers can be replaced directly. This can be useful when rolling out a vulnerability fix at scale across 1000s of running containers (👋 Buildpacks!).
Rebasing is not safe in general, and semantics for it are explicitly not intended as part of the spec. The standard annotations can be used as a signal though.
crane rebase
https://github.com/google/go-containerregistry/blob/main/cmd/crane/rebase.md
Requires users to pass old/new base images. We expect these to be --old_base=[image by digest]
and --new_base=[image by tag]
With this annotation, crane rebase my-image:foo
wouldn't need to take tags
pack rebase
https://buildpacks.io/docs/concepts/operations/rebase/
Buildpacks annotates base image ref + topLayer
(see Alternatives) to identify rebase seam
gcr.io/kontaindotme/rebase-me is based on ubuntu:16.04
, contains a shell script that does cat /etc/os-release
.
(Let's say it was built back when ubuntu:latest
was :16.04
, but time has moved on, we live in the future)
$ docker run gcr.io/kontaindotme/rebase-me
NAME="Ubuntu"
VERSION="16.04.7 LTS (Xenial Xerus)"
...
Let's rebase it on top of current ubuntu:latest
(:20.04
)
$ crane rebase \
--original=gcr.io/kontaindotme/rebase-me \
--old_base=ubuntu:16.04 \
--new_base=ubuntu:latest \
--rebased=gcr.io/kontaindotme/rebased
...
2021/02/17 10:51:40 gcr.io/kontaindotme/rebased: digest: sha256:4c0c8fb2348ce31143230e9280e22328271ff5c1233a18f820c4b0775f0e0190 size: 909
old_base
should be specified by digest, crane rebase
allows tags thoughoriginal
is not actually based on old_base
, rebase failsoriginal
is already based on new_base
, do nothingrebased
could be same as original
, to tag over itNow when we run our rebased
image:
$ docker run gcr.io/kontaindotme/rebased
NAME="Ubuntu"
VERSION="20.04.1 LTS (Focal Fossa)"
...
(This is not guaranteed to be safe; it's only safe here because my demo image doesn't depend on specifics of the underlying image)
If gcr.io/kontaindotme/rebase-me
had been annotated with:
org.opencontainers.image.base.digest: sha256:e74994...
org.opencontainers.image.base.ref.name: ubuntu:latest
(saying, "I am based on ubuntu:latest
, which at the time I was built was sha256:e74994...
")
…then automation could have scanned and found this out-of-date base image:
…then handed it to validation and release automation
crane rebase
can be simplified to:
crane rebase gcr.io/kontaindotme/rebase-me
Can assume rebased
==original
and derive old_base
and new_base
from annotations