原文地址:如何使用Skopeo优雅的搬运镜像
前情提要
系统:centos7
Github 官方地址: GitHub - containers/skopeo: Work with remote images registries - retrieving information, images, signing content
简介
Skopeo。它是一个命令行工具,用于在各种容器镜像和注册表之间执行各种操作。Skopeo 可以处理不需要完整Docker或任何其他容器运行时的场景。下面是一些 Skopeo 可以做的主要事情:
1.复制容器镜像: Skopeo 允许用户从一个注册表复制容器镜像到另一个注册表。
2.验证镜像: Skopeo 能够验证一个 docker V2s2 或者 OCI 镜像的 manifest,并确认那些特定于平台(如 Linux/amd64, Linux/arm64)的镜像可以在特定架构上使用。
3.检查远程镜像: 只根据docker镜像的名字来获取镜像的信息,不需要事先pull镜像。
4.删除远程镜像: Skopeo 可以强制删除 docker 注册表中的容器镜像。
5.对两个容器镜像进行比较:skopeo diff能够用来展示不同的文件、目录或者软链接。
需要注意的是,这些操作不需要Docker daemon的启动,所以Skopeo非常适合用在CI/CD系统中,来与容器镜像交互。
安装
官方安装文档:https://github.com/containers/skopeo/blob/main/install.md
centos系
x86环境
# 开启代理
[root@consul ~]# pigchacli
欢迎使用PigchaProxy
用户名:llody
会员到期:2099-12-31 00:00:00 +08:00
剩余流量:1.60GB
● 加速未启动
? 请选择操作 启动加速
? 是否选择上次节点加速? No
? 请选择一个节点加速 香港出(5000M/GPT/专线) 通用 No.6 【负载:49.0%】
● 已加速...
清理代理执行:unset https_proxy http_proxy
设置代理执行:export https_proxy=http://127.0.0.1:15777 http_proxy=http://127.0.0.1:15777
清理git代理执行:git config --global --unset https.proxy && git config --global --unset http.proxy
设置git代理执行:git config --global http.proxy http://127.0.0.1:15777 && git config --global https.proxy http://127.0.0.1:15777
# 启用git代理
git config --global http.proxy http://127.0.0.1:15777 && git config --global https.proxy http://127.0.0.1:15777
# 拉取代码
git clone --depth=1 https://github.com/containers/skopeo.git
#PS(推荐去下载发布版本的软件包构建,或者指定版本拉取)
# 进入skopeo目录
cd skopeo-1.13.0/
# 更换源
sed -i 's#proxy.golang.org#https://goproxy.cn#g' Makefile
# 编译依赖go-md2man组件,确认是否有此组件
[root@consul skopeo-1.13.0]# yum list | grep go-md2man
golang-github-cpuguy83-go-md2man.x86_64 1.0.4-5.el7 epel
# 安装
yum install -y golang-github-cpuguy83-go-md2man.x86_64
# 确认组件安装成功
[root@consul skopeo-1.13.0]# whereis go-md2man
go-md2man: /usr/bin/go-md2man
# 使用docker 编译
docker run -v $PWD:/src -v /usr/bin/go-md2man:/go/bin/go-md2man -w /src -e CGO_ENABLED=0 golang make BUILDTAGS=containers_image_openpgp GO_DYN_FLAGS=
Unable to find image 'golang:latest' locally
latest: Pulling from library/golang
d52e4f012db1: Pull complete
7dd206bea61f: Pull complete
2320f9be4a9c: Pull complete
543c0c50a70d: Pull complete
d4fb2f15aec7: Pull complete
c7f954b24574: Pull complete
Digest: sha256:cfc9d1b07b1ef4f7a4571f0b60a99646a92ef76adb7d9943f4cb7b606c6554e2
Status: Downloaded newer image for golang:latest
go build -ldflags '-X main.gitCommit=f2be411b7b418067b0fae4fe2c0b52f31c02b651 ' -gcflags "" -tags "containers_image_openpgp" -o bin/skopeo ./cmd/skopeo
sed -e 's/\((skopeo.*\.md)\)//' -e 's/\[\(skopeo.*\)\]/\1/' docs/skopeo-copy.1.md | go-md2man -in /dev/stdin -out docs/skopeo-copy.1
sed -e 's/\((skopeo.*\.md)\)//' -e 's/\[\(skopeo.*\)\]/\1/' docs/skopeo-delete.1.md | go-md2man -in /dev/stdin -out docs/skopeo-delete.1
sed -e 's/\((skopeo.*\.md)\)//' -e 's/\[\(skopeo.*\)\]/\1/' docs/skopeo-generate-sigstore-key.1.md | go-md2man -in /dev/stdin -out docs/skopeo-generate-sigstore-key.1
sed -e 's/\((skopeo.*\.md)\)//' -e 's/\[\(skopeo.*\)\]/\1/' docs/skopeo-inspect.1.md | go-md2man -in /dev/stdin -out docs/skopeo-inspect.1
sed -e 's/\((skopeo.*\.md)\)//' -e 's/\[\(skopeo.*\)\]/\1/' docs/skopeo-list-tags.1.md | go-md2man -in /dev/stdin -out docs/skopeo-list-tags.1
sed -e 's/\((skopeo.*\.md)\)//' -e 's/\[\(skopeo.*\)\]/\1/' docs/skopeo-login.1.md | go-md2man -in /dev/stdin -out docs/skopeo-login.1
sed -e 's/\((skopeo.*\.md)\)//' -e 's/\[\(skopeo.*\)\]/\1/' docs/skopeo-logout.1.md | go-md2man -in /dev/stdin -out docs/skopeo-logout.1
sed -e 's/\((skopeo.*\.md)\)//' -e 's/\[\(skopeo.*\)\]/\1/' docs/skopeo-manifest-digest.1.md | go-md2man -in /dev/stdin -out docs/skopeo-manifest-digest.1
sed -e 's/\((skopeo.*\.md)\)//' -e 's/\[\(skopeo.*\)\]/\1/' docs/skopeo-standalone-sign.1.md | go-md2man -in /dev/stdin -out docs/skopeo-standalone-sign.1
sed -e 's/\((skopeo.*\.md)\)//' -e 's/\[\(skopeo.*\)\]/\1/' docs/skopeo-standalone-verify.1.md | go-md2man -in /dev/stdin -out docs/skopeo-standalone-verify.1
sed -e 's/\((skopeo.*\.md)\)//' -e 's/\[\(skopeo.*\)\]/\1/' docs/skopeo-sync.1.md | go-md2man -in /dev/stdin -out docs/skopeo-sync.1
sed -e 's/\((skopeo.*\.md)\)//' -e 's/\[\(skopeo.*\)\]/\1/' docs/skopeo.1.md | go-md2man -in /dev/stdin -out docs/skopeo.1
# 确认是否编译成功
[root@consul skopeo-1.13.0]# bin/skopeo -v
skopeo version 1.13.0
arm64
# 前面拉取仓库代码操作和x86相同
# 安装go-md2man(https://rhel.pkgs.org/7/epel-aarch64/golang-github-cpuguy83-go-md2man-1.0.4-5.el7.aarch64.rpm.html)
wget https://dl.fedoraproject.org/pub/epel/7/aarch64/Packages/g/golang-github-cpuguy83-go-md2man-1.0.4-5.el7.aarch64.rpm
# 安装go-md2man组件
rpm -ivh golang-github-cpuguy83-go-md2man-1.0.4-5.el7.aarch64.rpm
whereis go-md2man
# 进入skopeo目录,进行容器编译
docker run -v $PWD:/src -v /usr/bin/go-md2man:/go/bin/go-md2man -w /src -e CGO_ENABLED=0 golang make BUILDTAGS=containers_image_openpgp GO_DYN_FLAGS=
# 确认版本
[root@consul skopeo-1.13.0]# bin/skopeo -v
skopeo version 1.13.0
debain系
# 拉取skopeo源码
git clone --depth=1 https://github.com/containers/skopeo.git # https://github.com/containers/skopeo.git
cd skopeo
sed -i 's#proxy.golang.org#https://goproxy.cn#g' Makefile
# 构建静态二进制文件
BUILD_IMAGE="golang:latest"
docker run --name skopeo-build -v $PWD:/src -v /usr/bin/go-md2man:/go/bin/go-md2man -w /src -e CGO_ENABLED=0 -e GOPROXY=https://goproxy.cn,direct ${BUILD_IMAGE} \
sh -c 'make BUILDTAGS=containers_image_openpgp GO_DYN_FLAGS='
# 确认命令版本
[root@consul skopeo-1.13.0]# bin/skopeo -v
skopeo version 1.13.0
帮助文档
root@llody:~# skopeo --help # 子命令可采用如下命令 skopeo [command] --help 命令
Usage:
skopeo [flags]
skopeo [command]
Available Commands:
copy # 复制一个镜像从 A 到 B,这里的 A 和 B 可以为本地 docker 镜像或者 registry 上的镜像;
delete # 删除一个镜像 tag,可以是本地 docker 镜像或者 registry 上的镜像;
help # 帮助查看
inspect # 查看一个镜像的 manifest 或者 image config 详细信息;
list-tags # 列出存储库名称指定的镜像的tag
login # 登陆某个镜像仓库,类似于 docker login 命令
logout # 退出某个已认证的镜像仓库, 类似于 docker logout 命令
manifest-digest # 计算文件的清单摘要是一个sha256sum 值
standalone-sign # 使用本地文件创建签名
standalone-verify # 验证本地文件的签名
sync # 将一个或多个图像从一个位置同步到另一个位置 (该功能非常Nice)
Flags:
--command-timeout duration # 命令超时时间(单位秒)
--debug # 启用debug模式
--insecure-policy # 在不进行任何策略检查的情况下运行该工具(如果没有配置 policy 的话需要加上该参数)
--override-arch ARCH # 处理镜像时覆盖客户端 CPU 体系架构,如在 amd64 的机器上用 skopeo 处理 arm64 的镜像
--override-os OS # 处理镜像时覆盖客户端 OS
--override-variant VARIANT # 处理镜像时使用VARIANT而不是运行架构变量
--policy string # 信任策略文件的路径 (为镜像配置安全策略情况下使用)
--registries.d DIR # 在目录中使用Registry配置文件(例如,用于容器签名存储)
--tmpdir string # 用于存储临时文件的目录
-h, --help help for skopeo
-v, --version Version for Skopeo
使用
登录
# 可以先登录需要操作的几个镜像仓库
skopeo login -u user -p password docker.io
注销登录
skopeo logout docker.io
从一个仓库拷贝到另一个仓库
# 从一个仓库拷贝到另一个仓库
skopeo copy docker://docker.io/llody/jdk:v11.0.11 docker://192.168.1.221/llody/jdk:v11.0.11 --dest-tls-verify=false --src-tls-verify=false
--authfile 指定认证文件
--src-tls-verify=false 注册表跳过ssl验证
--dest-tls-verify=false 交互时不验证ssl
从一个仓库同步所以版本到另一个仓库
skopeo sync --src docker --dest docker docker.io/llody 192.168.1.221/llody/ --src-tls-verify=false --dest-tls-verify=false
查看有哪些tags
skopeo list-tags docker://docker.io/llody
删除镜像
skopeo delete docker://docker.io/llody/jdk:v11.0.11 --tls-verify=false --debug
自此,可以愉快的搬运镜像了,镜像仓库迁移也有了解决方案,此工具还可以于CICD结合,例如GitHub Actions 结合,使用流水线把国外的镜像搬回国的操作,也可以与Jenkins结合,将构建镜像同步至不同镜像仓库中。
下篇文章,我准备讲讲buildah工具,等我耍个周末回来就写。