无法直接使用基于 containerd 的 CLI 从 Docker-managed containerd 检索数据
Unable to retrieve data from Docker-managed containerd by using containerd-based CLI directly
这是我想要完成的:
运行 Docker 并能够从 containerd 的 API 管理它的 images/containers。这纯粹是一个教育练习。
我试过的:
- 启动 dockerd
- 已验证我有一个正在运行的守护进程:
$ docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
mcr.microsoft.com/dotnet/runtime latest ec54a6c985a0 11 days ago 186MB
- 已安装 nerdctl 用作 containerd 的 CLI。
- 已尝试连接到 Docker 管理的 containerd 的相同套接字和命名空间,但没有得到任何结果:
$ nerdctl --address /var/run/docker/containerd/containerd.sock -n moby images
REPOSITORY TAG IMAGE ID CREATED SIZE
- 我也尝试过直接从 Go 执行此操作,但仍然没有得到任何结果:
package main
import (
"context"
"log"
"github.com/containerd/containerd"
"github.com/containerd/containerd/namespaces"
)
func main() {
if err := test(); err != nil {
log.Fatal(err)
}
}
func test() error {
client, err := containerd.New("/var/run/docker/containerd/containerd.sock")
if err != nil {
return err
}
defer client.Close()
ctx := namespaces.WithNamespace(context.Background(), "moby")
images, err := client.ListImages(ctx)
if err != nil {
return err
}
log.Printf("%v images\n", len(images))
return nil
}
我获得成功的连接这一事实表明一切都在正确的轨道上。我只是不明白为什么在 Docker 命令和直接调用 containerd 之间看不到相同的结果。
得到了 Docker 维护者 Sebastiaan van Stijn 的回答:
dockerd uses the runtime components of containerd, but not (yet?) the image store and snapshotters, which is why you don't see the images, only containers
这是我想要完成的:
运行 Docker 并能够从 containerd 的 API 管理它的 images/containers。这纯粹是一个教育练习。
我试过的:
- 启动 dockerd
- 已验证我有一个正在运行的守护进程:
$ docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
mcr.microsoft.com/dotnet/runtime latest ec54a6c985a0 11 days ago 186MB
- 已安装 nerdctl 用作 containerd 的 CLI。
- 已尝试连接到 Docker 管理的 containerd 的相同套接字和命名空间,但没有得到任何结果:
$ nerdctl --address /var/run/docker/containerd/containerd.sock -n moby images
REPOSITORY TAG IMAGE ID CREATED SIZE
- 我也尝试过直接从 Go 执行此操作,但仍然没有得到任何结果:
package main
import (
"context"
"log"
"github.com/containerd/containerd"
"github.com/containerd/containerd/namespaces"
)
func main() {
if err := test(); err != nil {
log.Fatal(err)
}
}
func test() error {
client, err := containerd.New("/var/run/docker/containerd/containerd.sock")
if err != nil {
return err
}
defer client.Close()
ctx := namespaces.WithNamespace(context.Background(), "moby")
images, err := client.ListImages(ctx)
if err != nil {
return err
}
log.Printf("%v images\n", len(images))
return nil
}
我获得成功的连接这一事实表明一切都在正确的轨道上。我只是不明白为什么在 Docker 命令和直接调用 containerd 之间看不到相同的结果。
得到了 Docker 维护者 Sebastiaan van Stijn 的回答:
dockerd uses the runtime components of containerd, but not (yet?) the image store and snapshotters, which is why you don't see the images, only containers