Skopeo 工具介绍

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 参数接受所有镜像。注意,这些策略参数是"全局"参数,必须在操作命令之前添加(例如 inspectcopydelete 等)。最简单的方式是在默认位置创建一个策略文件以允许所有注册表:

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。

相关推荐
Mao.O2 小时前
RabbitMQ延迟消息插件安装(Docker环境)
docker·rabbitmq·延迟消息发送
pyliumy3 小时前
docker的安装配置与基本简单命令
运维·docker·容器
test12804 小时前
局域网 docker pull 使用代理拉取镜像
docker·容器·代理·docker pull·http_proxy
sudo_Ene4 小时前
Isaac Sim Docker 部署并使用过程记录
笔记·学习·docker·1024程序员节·isaacsim
天幕繁星5 小时前
docker占用磁盘过多问题
docker·容器
26293526746 小时前
Docker常用命令
java·docker·eureka
bala55696 小时前
Docker-在Centos中部署Shell脚本获取镜像并构建容器
linux·阿里云·docker·容器·centos·maven
知数SEO6 小时前
Centos如何卸载docker
linux·docker·centos
水w10 小时前
docker怎么实现资源隔离的?
运维·开发语言·后端·docker·容器