From cfdef4995afd80962dede1a7bf8b4431b3a2c7d0 Mon Sep 17 00:00:00 2001 From: Franck Cuny Date: Tue, 13 Apr 2021 19:41:04 -0700 Subject: pull a container into a namespace Pull an image provided as an argument to the program. We're only interested in images for Linux/amd64 at the moment. We setup a default namespace for containerd named `c2vm`. Images that will be pulled by containerd will be stored inside that namespace. Once the program is build it can be run like this: ``` ; sudo ./c2vm -container docker.io/library/redis:latest pulled docker.io/library/redis:latest (38667897 bytes) ``` And the image is indeed in the namespace: ``` ; sudo ctr -n c2vm images ls -q docker.io/library/redis:latest ``` --- cmd/c2vm/main.go | 56 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 56 insertions(+) create mode 100644 cmd/c2vm/main.go (limited to 'cmd/c2vm') diff --git a/cmd/c2vm/main.go b/cmd/c2vm/main.go new file mode 100644 index 0000000..4d0968b --- /dev/null +++ b/cmd/c2vm/main.go @@ -0,0 +1,56 @@ +package main + +import ( + "context" + "flag" + "fmt" + "log" + + "github.com/containerd/containerd" + "github.com/containerd/containerd/namespaces" + "github.com/containerd/containerd/platforms" + ocispec "github.com/opencontainers/image-spec/specs-go/v1" +) + +const ( + containerdSock = "/run/containerd/containerd.sock" + defaultNamespace = "c2vm" +) + +var ( + platform = platforms.Only(ocispec.Platform{ + OS: "linux", + Architecture: "amd64", + }) +) + +func main() { + var ( + containerName = flag.String("container", "", "Name of the container") + ) + + flag.Parse() + + if *containerName == "" { + log.Fatal("a container is required") + } + + client, err := containerd.New(containerdSock) + if err != nil { + log.Fatalf("failed to create a client for containerd: %v", err) + } + defer client.Close() + + ctx := namespaces.WithNamespace(context.Background(), defaultNamespace) + image, err := client.Pull(ctx, *containerName, containerd.WithPlatformMatcher(platform)) + if err != nil { + log.Fatalf("failed to pull the container %s: %v\n", *containerName, err) + } + + imageSize, err := image.Usage(ctx, containerd.WithUsageManifestLimit(1)) + if err != nil { + log.Fatalf("failed to get the size of the image: %v", err) + } + + fmt.Printf("pulled %s (%d bytes)\n", image.Name(), imageSize) +} -- cgit 1.4.1