初识 skopeo

什么是 skopeo

skopeo是在容器镜像和镜像存储库上执行各种操作的命令行工具。与 Podman 一样,它不需要守护进程,也不需要 root 权限。兼容 docker 镜像和 OCI 镜像。

它大概有以下功能:

  • 复制镜像(包括本地、远程甚至文件夹,非常强大!)
  • 删除镜像
  • 查看镜像信息
  • 返回一个远程镜像的标签列表
  • 登录、登出远程仓库
  • 同步本地和远程镜像
  • 镜像签名
  • 计算镜像摘要

它支持很多种镜像仓库类型:

  • containers-storage:docker-reference 本地镜像存储(podman、cri-o、buildah 和 类似使用 OCI 标准的容器工具拉取的镜像文件文件夹)
  • dir:path 现有的本地目录路径,将清单、图层压缩包和签名作为单个文件存储。这是一种非标准化的格式,主要用于调试或非侵入性的容器检查。
  • docker://docker-reference 远程镜像仓库
  • docker-archive:path[:docker-reference] docker 打包镜像文件
  • docker-daemon:docker-reference 本地 docker 拉取的镜像文件
  • oci:path:tag 符合 OCI 标准的镜像文件夹

OCI 镜像

我初识它是在一次上线的过程中,当我们的镜像经过测试准备上线预发环境时,一般会将镜像的 tag 由 alpha 变更为 rc ,然后让预发环境的 K8s 来引用此镜像,以前一直使用的是我们的 CI 工作流,并没有注意到其中的细节,直到我这个镜像是一个新的项目,而 CI 工作流变更 TAG 的操作并没有匹配此镜像,需要我手动来做镜像 TAG 的修改。于是,去看了看我们的 CI ,发现它居然是使用的一个叫 skopeo 的工具,而不是 docker。这就很有趣,于是我尝试在本地安装。

安装配置 skopeo

Mac安装它也是非常容易的:brew install skopeo 即可。

在我的 ArchLinux 下,也可以直接使用sudo pacman -S skopeo进行安装,其它的 Linux 发行版也类似

与 Podman 不同,skopeo 基本上不需要什么配置的,当然了,为了复制我的镜像,我仍然需要登录镜像仓库:

skopeo login --username zidoshare docker.io

如果是私有仓库,直接将 docker.io 替换为私有化仓库地址即可,这与 docker 类似。

使用 skopeo 复制镜像

接下来就是神奇的一幕了,我们的场景是需要重新打 tag,如果是使用 docker,那么我们需要执行如下操作:

docker pull zidoshare/get-started:0.0.1-alpha1
docker tag zidoshare/get-started:0.0.1-alpha1 zidoshare/get-started:0.0.1-rc1
docker push zidoshare/get-started:0.0.1-rc1

其中还有下载上传的操作非常耗时,但是使用 skopeo,一切就不同了:

$ skopeo copy docker://zidoshare/get-started:0.0.1-alpha1 docker://zidoshare/get-started:0.0.1-rc1
Getting image source signatures
Copying blob 7e9476afc441 skipped: already exists
Copying blob ead11ecb9832 skipped: already exists
Copying blob ea4d16630268 skipped: already exists
Copying blob d1ef2eb755bd skipped: already exists
Copying blob f91050b345a6 skipped: already exists
Copying blob 6ae821421a7d skipped: already exists
Copying blob 3aca3bc5597a [--------------------------------------] 0.0b / 0.0b
Copying config 2f0f422085 [--------------------------------------] 0.0b / 7.2KiB
Writing manifest to image destination
Storing signatures

一行命令就搞定,而且,非常快,它直接在镜像仓库中操作,几乎不会有太多的上传下载,十分便捷。 这里的 docker:// 就代表是远程镜像仓库。其它的命令暂时用不上,但是这一个是真的非常强,强烈推荐。

总结

podman 与 skopeo 实际上有一定的功能交叉,但是专人专事吧,我一般建议 podman 还是作为本地无守护进程的 容器运行时(管理)工具,而 skopeo 专注于镜像传输,接下来就还差一个镜像构建了,这是下一篇博客的内容。