import: Add option to skip creating digest image

Signed-off-by: Kohei Tokunaga <ktokunaga.mail@gmail.com>
This commit is contained in:
Kohei Tokunaga 2021-09-14 22:47:31 +09:00
parent 8493cd1a50
commit 6875aa5d37
2 changed files with 27 additions and 0 deletions

View File

@ -60,6 +60,10 @@ If foobar.tar contains an OCI ref named "latest" and anonymous ref "sha256:deadb
Name: "digests", Name: "digests",
Usage: "whether to create digest images (default: false)", Usage: "whether to create digest images (default: false)",
}, },
cli.BoolFlag{
Name: "skip-digest-for-named",
Usage: "skip applying --digests option to images named in the importing tar (use it in conjunction with --digests)",
},
cli.StringFlag{ cli.StringFlag{
Name: "index-name", Name: "index-name",
Usage: "image name to keep index as, by default index is discarded", Usage: "image name to keep index as, by default index is discarded",
@ -96,6 +100,12 @@ If foobar.tar contains an OCI ref named "latest" and anonymous ref "sha256:deadb
if context.Bool("digests") { if context.Bool("digests") {
opts = append(opts, containerd.WithDigestRef(archive.DigestTranslator(prefix))) opts = append(opts, containerd.WithDigestRef(archive.DigestTranslator(prefix)))
} }
if context.Bool("skip-digest-for-named") {
if !context.Bool("digests") {
return fmt.Errorf("--skip-digest-for-named must be specified with --digests option")
}
opts = append(opts, containerd.WithSkipDigestRef(func(name string) bool { return name != "" }))
}
if idxName := context.String("index-name"); idxName != "" { if idxName := context.String("index-name"); idxName != "" {
opts = append(opts, containerd.WithIndexName(idxName)) opts = append(opts, containerd.WithIndexName(idxName))

View File

@ -34,6 +34,7 @@ type importOpts struct {
indexName string indexName string
imageRefT func(string) string imageRefT func(string) string
dgstRefT func(digest.Digest) string dgstRefT func(digest.Digest) string
skipDgstRef func(string) bool
allPlatforms bool allPlatforms bool
compress bool compress bool
} }
@ -59,6 +60,17 @@ func WithDigestRef(f func(digest.Digest) string) ImportOpt {
} }
} }
// WithSkipDigestRef is used to specify when to skip applying
// WithDigestRef. The callback receives an image reference (or an empty
// string if not specified in the image). When the callback returns true,
// the skip occurs.
func WithSkipDigestRef(f func(string) bool) ImportOpt {
return func(c *importOpts) error {
c.skipDgstRef = f
return nil
}
}
// WithIndexName creates a tag pointing to the imported index // WithIndexName creates a tag pointing to the imported index
func WithIndexName(name string) ImportOpt { func WithIndexName(name string) ImportOpt {
return func(c *importOpts) error { return func(c *importOpts) error {
@ -152,6 +164,11 @@ func (c *Client) Import(ctx context.Context, reader io.Reader, opts ...ImportOpt
Target: m, Target: m,
}) })
} }
if iopts.skipDgstRef != nil {
if iopts.skipDgstRef(name) {
continue
}
}
if iopts.dgstRefT != nil { if iopts.dgstRefT != nil {
ref := iopts.dgstRefT(m.Digest) ref := iopts.dgstRefT(m.Digest)
if ref != "" { if ref != "" {