diff options
author | Franck Cuny <franck.cuny@gmail.com> | 2021-04-13 19:41:04 -0700 |
---|---|---|
committer | Franck Cuny <franck.cuny@gmail.com> | 2021-04-13 19:41:04 -0700 |
commit | cfdef4995afd80962dede1a7bf8b4431b3a2c7d0 (patch) | |
tree | 9b671b7aa0671f32ec40b27dfd9d91d5bcb75933 /cmd | |
parent | doc: update README (diff) | |
download | containerd-to-vm-cfdef4995afd80962dede1a7bf8b4431b3a2c7d0.tar.gz |
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 ```
Diffstat (limited to 'cmd')
-rw-r--r-- | cmd/c2vm/main.go | 56 |
1 files changed, 56 insertions, 0 deletions
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) +} |