Skopeo
Skopeo 是一个简单的命令行工具,用于与注册表交互,管理容器镜像的检查、复制和删除操作。尽管这些任务也可以用 Podman 来完成,但 Skopeo 是一个更轻量级的"专注于做一件事并将其做好"的工具。
可以很容易地在 macOS 上安装该二进制文件,只需使用 brew install skopeo
,且我们完全不需要 Linux 主机------你可以关闭 Linux 虚拟机。
ruby
$ skopeo -v
skopeo version 0.1.40
在进行任何有用的操作之前,我们需要创建一个 containers-policy
文件,文件包含验证规则来决定是否接受拉取的镜像。默认位置是 /etc/containers/policy.json
,也可以通过 --policy <policy file>
参数指向另一个文件。或者,我们可以使用 --insecure-policy
参数接受所有镜像。注意,这些策略参数是"全局"参数,必须在操作命令之前添加(例如 inspect
、copy
、delete
等)。最简单的方式是在默认位置创建一个策略文件以允许所有注册表:
arduino
$ sudo sh -c 'cat >/etc/containers/policy.json' <<EOF
{
"default": [
{
"type": "insecureAcceptAnything"
}
],
"transports":
{
"docker-daemon":
{
"": [{"type":"insecureAcceptAnything"}]
}
}
}
EOF
要访问需要身份验证的注册表,我们需要传递凭据。有两种选择:
- 用户名:密码:基于命令使用
--creds
、--src-creds
、--dest-creds
参数 - authfile:Docker 身份验证文件,与 Podman 中的相同,可以通过
--authfile <auth file>
添加。如果未设置,Skopeo 会查找默认位置$HOME/.docker/config.json
。这是一个示例文件:
json
{
"auths": {
"registry.redhat.io": {
"auth": "<username:password in base64>"
},
"quay.io": {
"auth": "bXl1c2VyOm15c2VjcmV0"
}
}
}
通过多种参数可以实现信任或忽略 TLS 证书,具体取决于所使用的 Skopeo 命令:--cert-dir
、--tls-verify
、--src-cert-dir
、--src-tl-verify
、--dest-cert-dir
、--dest-tls-verify
。
检查
Skopeo 可以用来从注册表中读取关于镜像的信息------无需先下载镜像:
json
$ skopeo inspect docker://quay.io/quay/busybox:latest
{
"Digest": "sha256:91aa1e3e55765a568...",
"RepoTags": ...
对于支持多个操作系统版本镜像的注册表,需要添加全局参数 --override-os linux
,否则默认使用 MacOS OS darwin 而找不到镜像。
ruby
$ skopeo --override-os linux inspect docker://docker.io/nginx$ skopeo --override-os linux inspect --authfile myauth.json docker://registry.redhat.io/openshift3/jenkins-2-rhel7
对于详细信息(例如层、入口点、cmd),检查来自注册表的原始响应:
arduino
$ skopeo --override-os linux inspect --config --raw docker://docker.io/nginx | jq .
检查还可用于某些格式(例如已通过 skopeo copy
下载的镜像)中保存在本地磁盘上的镜像:
shell
# 镜像保存为 docker-archive
$ skopeo inspect docker-archive:/tmp/mytag.latest.tar
# 检查 oci-archive 镜像,尝试使用 /var/tmp/,需要 sudo
$ sudo skopeo inspect oci-archive:/tmp/mytag.latest.oci
# 镜像保存为目录或 oci 目录
$ skopeo inspect dir:/tmp/mytag-latest-dir/
$ skopeo inspect oci:/tmp/mytag-latest-oci/
复制
使用 Skopeo 最常见的任务是将镜像从一个注册表复制到另一个注册表。需要多个参数,但在理解了上面检查命令的基本参数后就很明显了。以下示例将 Jenkins 镜像从 registry.redhat.io
复制到 quay.io
:
shell
# 简单示例 - 已准备好策略和身份验证文件
$ skopeo --override-os linux copy docker://registry.redhat.io/openshift3/jenkins-2-rhel7:v3.11 docker://quay.io/bszeti/jenkins:v3.11
注意:根据注册表情况,可能需要或不需要 --override-os linux
,就像 skopeo inspect 一样。
现在可以添加身份验证和 TLS 参数,例如在私有存储库之间复制镜像:
bash
$ skopeo --insecure-policy copy
--src-tls-verify=false --dest-tls-verify=false
--src-creds 'devuser:secret' --dest-creds 'myuser:secret' docker://devregistry.host:5000/myteam/myapp:v1 docker://myregistry.host:8443/myteam/myapp:mytag
我们还可以使用 skopeo copy
来标记镜像。Skopeo 检查目标注册表中是否已经存在图层,以避免不必要的数据复制。
shell
$ skopeo copy docker://myregistry:8443/myteam/myapp:v1 docker://myregistry:8443/myteam/myapp:qa
还可以使用复制命令将镜像保存到本地磁盘上不同的格式。
shell
$ skopeo copy docker://docker.io/nginx docker-archive:/tmp/nginx.tar
$ skopeo copy docker://docker.io/nginx oci-archive:/tmp/nginx.oci
$ skopeo copy docker://docker.io/nginx dir:/tmp/nginx-dir
$ skopeo copy docker://docker.io/nginx oci:/tmp/nginx-oci
注意:在处理归档时,Skopeo 在某些情况下会使用 /var/tmp
下的临时目录,因此除非以 root 运行,否则可能会遇到权限问题。
总结
新的一套无守护进程、开源的容器管理工具已经成熟,可以自信地用于 Linux 机器。不幸的是,它们在 macOS 上还没有完全原生支持。但是,通过一些手动设置和小小的妥协,我们现在可以开始使用这些工具。希望本指南帮助您简化这个过程,同时也期待未来更加无缝的体验。
全文完!
如果你喜欢我的文章,欢迎关注我的微信公众号 deliverit。