skopeo
是一个命令行实用程序,用于对容器镜像和镜像仓库执行各种操作。
skopeo
在执行大多数操作时,不要求用户以 root 身份运行。
skopeo
执行其操作时无需守护进程处于运行状态。
skopeo
可以处理 OCI 镜像以及原始的 Docker v2 镜像。
Skopeo 可以与 API V2 容器镜像注册表(如 docker.io 和 quay.io 注册表、私有注册表、本地目录以及本地 OCI 布局目录)配合使用。Skopeo 可执行的操作包括:
Skopeo 支持以下镜像和仓库类型:
容器存储:Docker 参考 位于本地容器/存储镜像存储中的镜像。位置和镜像存储均在 /etc/containers/storage.conf 中指定。(这是 Podman、CRI-O、Buildah 及其相关工具的后端)
路径:dir 一个现有的本地目录路径,用于存储清单、层的 tar 包和签名作为单独的文件。这是一种非标准化格式,主要用于调试或非侵入式容器检查。
docker://docker-reference:这是在实现“Docker Registry HTTP API V2”的注册表中的一个镜像。默认情况下,它使用位于 $XDG_RUNTIME_DIR/containers/auth.json 中的授权状态,该状态是通过 skopeo login 命令设置的。
docker-archive:路径[:docker-reference] 镜像存储在 docker save 格式的文件中。docker-reference 仅在创建此类文件时使用,且不能包含摘要。
docker-daemon:docker-reference 是存储在 Docker 守护进程内部存储中的一个名为 docker-reference 的镜像。docker-reference 必须包含标签或摘要。另外,在读取镜像时,格式也可以是 docker-daemon:algo:digest(镜像 ID)。
oci:path:tag 位于路径 path 下符合“开放容器镜像布局规范”的目录中的镜像标签。
有关如何安装或构建 skopeo 的详细说明,请参阅 install.md。
Skopeo 也可作为容器镜像在 quay.io 上获取。如需了解更多信息,请参阅 Skopeo 镜像页面。
Skopeo能够检查容器注册表上的仓库并获取镜像层。inspect命令获取存储库的清单,它能够向您显示关于整个仓库或标签的docker inspect样的json输出。与docker inspect不同,这个工具可以帮助您在拉取仓库或标签(使用磁盘空间)之前收集有关该仓库或标签的有用信息。inspect命令可以显示哪些标签可用于给定的仓库、镜像具有的标签、镜像的创建日期和操作系统等。
例子:
$ skopeo inspect docker://registry.fedoraproject.org/fedora:latest
{
"Name": "registry.fedoraproject.org/fedora",
"Digest": "sha256:0f65bee641e821f8118acafb44c2f8fe30c2fc6b9a2b3729c0660376391aa117",
"RepoTags": [
"34-aarch64",
"34",
"latest",
...
],
"Created": "2022-11-24T13:54:18Z",
"DockerVersion": "1.10.1",
"Labels": {
"license": "MIT",
"name": "fedora",
"vendor": "Fedora Project",
"version": "37"
},
"Architecture": "amd64",
"Os": "linux",
"Layers": [
"sha256:2a0fc6bf62e155737f0ace6142ee686f3c471c1aab4241dc3128904db46288f0"
],
"LayersData": [
{
"MIMEType": "application/vnd.docker.image.rootfs.diff.tar.gzip",
"Digest": "sha256:2a0fc6bf62e155737f0ace6142ee686f3c471c1aab4241dc3128904db46288f0",
"Size": 71355009,
"Annotations": null
}
],
"Env": [
"DISTTAG=f37container",
"FGC=f37",
"container=oci"
]
}
$ skopeo inspect --config docker://registry.fedoraproject.org/fedora:latest | jq
{
"created": "2020-04-29T06:48:16Z",
"architecture": "amd64",
"os": "linux",
"config": {
"Env": [
"DISTTAG=f32container",
"FGC=f32",
"container=oci"
],
"Cmd": [
"/bin/bash"
],
"Labels": {
"license": "MIT",
"name": "fedora",
"vendor": "Fedora Project",
"version": "32"
}
},
"rootfs": {
"type": "layers",
"diff_ids": [
"sha256:a4c0fa2b217d3fd63d51e55a6fd59432e543d499c0df2b1acd48fbe424f2ddd1"
]
},
"history": [
{
"created": "2020-04-29T06:48:16Z",
"comment": "Created by Image Factory"
}
]
}
$ skopeo inspect docker://registry.fedoraproject.org/fedora:latest | jq '.Digest'
"sha256:655721ff613ee766a4126cb5e0d5ae81598e1b0c3bcf7017c36c4d72cb092fe9"
Skopeo可以在不同的存储机制之间复制容器镜像,包括:
$ skopeo copy docker://quay.io/buildah/stable docker://registry.internal.company.com/buildah
$ skopeo copy oci:busybox_ocilayout:latest dir:existingemptydirectory
如果遇到 x509: certificate signed by unknown authority 错误,通常是因为目标镜像仓库使用了自签名证书或私有证书,而系统无法验证这些证书的合法性。如果你信任目标镜像仓库,可以通过 --src-tls-verify=false 或 --dest-tls-verify=false 参数忽略 TLS 证书验证。这种方法适用于测试环境,但不推荐用于生产环境。
$ skopeo delete docker://localhost:5000/imagename:latest
$ skopeo sync --src docker --dest dir registry.example.com/busybox /media/usb
如果设置了skopeo凭据,skopeo则使用来自——creds(用于skopeo inspect|delete)或——src-creds|——dest-creds(用于skopeo copy)标志的凭据;否则,它使用skopeo login、podman login、buildah login或docker login设置的配置。
$ skopeo login --username USER myregistrydomain.com:5000
Password:
$ skopeo inspect docker://myregistrydomain.com:5000/busybox
{"Tag":"latest","Digest":"sha256:473bb2189d7b913ed7187a33d11e743fdc2f88931122a44d91a301b64419f092","RepoTags":["latest"],"Comment":"","Created":"2016-01-15T18:06:41.282540103Z","ContainerConfig":{"Hostname":"aded96b43f48","Domainname":"","User":"","AttachStdin":false,"AttachStdout":false,"AttachStderr":false,"Tty":false,"OpenStdin":false,"StdinOnce":false,"Env":null,"Cmd":["/bin/sh","-c","#(nop) CMD [\"sh\"]"],"Image":"9e77fef7a1c9f989988c06620dabc4020c607885b959a2cbd7c2283c91da3e33","Volumes":null,"WorkingDir":"","Entrypoint":null,"OnBuild":null,"Labels":null},"DockerVersion":"1.8.3","Author":"","Config":{"Hostname":"aded96b43f48","Domainname":"","User":"","AttachStdin":false,"AttachStdout":false,"AttachStderr":false,"Tty":false,"OpenStdin":false,"StdinOnce":false,"Env":null,"Cmd":["sh"],"Image":"9e77fef7a1c9f989988c06620dabc4020c607885b959a2cbd7c2283c91da3e33","Volumes":null,"WorkingDir":"","Entrypoint":null,"OnBuild":null,"Labels":null},"Architecture":"amd64","Os":"linux"}
$ skopeo logout myregistrydomain.com:5000
$ skopeo inspect --creds=testuser:testpassword docker://myregistrydomain.com:5000/busybox
{"Tag":"latest","Digest":"sha256:473bb2189d7b913ed7187a33d11e743fdc2f88931122a44d91a301b64419f092","RepoTags":["latest"],"Comment":"","Created":"2016-01-15T18:06:41.282540103Z","ContainerConfig":{"Hostname":"aded96b43f48","Domainname":"","User":"","AttachStdin":false,"AttachStdout":false,"AttachStderr":false,"Tty":false,"OpenStdin":false,"StdinOnce":false,"Env":null,"Cmd":["/bin/sh","-c","#(nop) CMD [\"sh\"]"],"Image":"9e77fef7a1c9f989988c06620dabc4020c607885b959a2cbd7c2283c91da3e33","Volumes":null,"WorkingDir":"","Entrypoint":null,"OnBuild":null,"Labels":null},"DockerVersion":"1.8.3","Author":"","Config":{"Hostname":"aded96b43f48","Domainname":"","User":"","AttachStdin":false,"AttachStdout":false,"AttachStderr":false,"Tty":false,"OpenStdin":false,"StdinOnce":false,"Env":null,"Cmd":["sh"],"Image":"9e77fef7a1c9f989988c06620dabc4020c607885b959a2cbd7c2283c91da3e33","Volumes":null,"WorkingDir":"","Entrypoint":null,"OnBuild":null,"Labels":null},"Architecture":"amd64","Os":"linux"}
$ skopeo copy --src-creds=testuser:testpassword docker://myregistrydomain.com:5000/private oci:local_oci_image