Unify docker and oci importer
Signed-off-by: Derek McGowan <derek@mcgstyle.net>
This commit is contained in:
@@ -20,13 +20,11 @@ import (
|
||||
"fmt"
|
||||
"io"
|
||||
"os"
|
||||
"strings"
|
||||
"time"
|
||||
|
||||
"github.com/containerd/containerd"
|
||||
"github.com/containerd/containerd/cmd/ctr/commands"
|
||||
"github.com/containerd/containerd/images/docker"
|
||||
oci "github.com/containerd/containerd/images/oci"
|
||||
"github.com/containerd/containerd/images/archive"
|
||||
"github.com/containerd/containerd/log"
|
||||
"github.com/urfave/cli"
|
||||
)
|
||||
@@ -42,30 +40,25 @@ Implemented formats:
|
||||
- docker.v1.2
|
||||
|
||||
|
||||
For OCI v1, you may need to specify --base-name because an OCI archive
|
||||
contains only partial image references (tags without the base image name).
|
||||
If no base image name is provided, a name will be generated as "import-%{date}".
|
||||
For OCI v1, you may need to specify --base-name because an OCI archive may
|
||||
contain only partial image references (tags without the base image name).
|
||||
If no base image name is provided, a name will be generated as "import-%{yyyy-MM-dd}".
|
||||
|
||||
e.g.
|
||||
$ ctr images import --format oci.v1 --oci-name foo/bar foobar.tar
|
||||
$ ctr images import --base-name foo/bar foobar.tar
|
||||
|
||||
If foobar.tar contains an OCI ref named "latest" and anonymous ref "sha256:deadbeef", the command will create
|
||||
"foo/bar:latest" and "foo/bar@sha256:deadbeef" images in the containerd store.
|
||||
`,
|
||||
Flags: append([]cli.Flag{
|
||||
cli.StringFlag{
|
||||
Name: "format",
|
||||
Name: "base-name",
|
||||
Value: "",
|
||||
Usage: "image format, by default supports OCI v1, Docker v1.1, Docker v1.2",
|
||||
},
|
||||
cli.StringFlag{
|
||||
Name: "base-name,oci-name",
|
||||
Value: "",
|
||||
Usage: "base image name for added images, when provided images without this name prefix are filtered out",
|
||||
Usage: "base image name for added images, when provided only images with this name prefix are imported",
|
||||
},
|
||||
cli.BoolFlag{
|
||||
Name: "digests",
|
||||
Usage: "whether to create digest images",
|
||||
Usage: "whether to create digest images (default: false)",
|
||||
},
|
||||
cli.StringFlag{
|
||||
Name: "index-name",
|
||||
@@ -82,25 +75,14 @@ If foobar.tar contains an OCI ref named "latest" and anonymous ref "sha256:deadb
|
||||
prefix := context.String("base-name")
|
||||
if prefix == "" {
|
||||
prefix = fmt.Sprintf("import-%s", time.Now().Format("2006-01-02"))
|
||||
opts = append(opts, containerd.WithImageRefTranslator(docker.RefTranslator(prefix, false)))
|
||||
opts = append(opts, containerd.WithImageRefTranslator(archive.AddRefPrefix(prefix)))
|
||||
} else {
|
||||
// When provided, filter out references which do not match
|
||||
opts = append(opts, containerd.WithImageRefTranslator(docker.RefTranslator(prefix, true)))
|
||||
}
|
||||
|
||||
switch format := context.String("format"); format {
|
||||
case "", "docker", "docker.v1.1", "docker.v1.2":
|
||||
opts = append(opts, containerd.WithImporter(&docker.V1Importer{
|
||||
SkipOCI: strings.HasPrefix(format, "docker"),
|
||||
}))
|
||||
case "oci", "oci.v1":
|
||||
opts = append(opts, containerd.WithImporter(&oci.V1Importer{}))
|
||||
default:
|
||||
return fmt.Errorf("unknown format %s", format)
|
||||
opts = append(opts, containerd.WithImageRefTranslator(archive.FilterRefPrefix(prefix)))
|
||||
}
|
||||
|
||||
if context.Bool("digests") {
|
||||
opts = append(opts, containerd.WithDigestRef(oci.DigestTranslator(prefix)))
|
||||
opts = append(opts, containerd.WithDigestRef(archive.DigestTranslator(prefix)))
|
||||
}
|
||||
|
||||
if idxName := context.String("index-name"); idxName != "" {
|
||||
|
Reference in New Issue
Block a user