|
什么是Skopeo? skopeo 使用 API V2 Registry,例如 Docker Registry、Atomic Registry、私有Registry、本地目录和本地 OCI 镜像目录。skopeo 不需要运行守护进程,它可以执行的操作包括:
-
通过各种存储机制复制镜像,例如,可以在不需要特权的情况下将镜像从一个Registry复制到另一个Registry
-
检测远程镜像并查看其属性,包括其图层,无需将镜像拉到本地
-
从镜像库中删除镜像
-
当存储库需要时,skopeo 可以传递适当的凭据和证书进行身份验证
镜像存储特点 根据 Robin 大佬在 《镜像仓库中镜像存储的原理解析》文章里得出的结论:
-
通过 Registry API 获得的两个镜像仓库中相同镜像的 manifest 信息完全相同。
-
两个镜像仓库中相同镜像的 manifest 信息的存储路径和内容完全相同。
-
两个镜像仓库中相同镜像的 blob 信息的存储路径和内容完全相同
项目信息 Github 官方地址: https://github.com/containers/skopeo Gitee mirror: https://gitee.com/mirrors/skopeo
0x01 安装编译
描述: Skopeo 官方安装&编译方式参考文档: https://github.com/containers/skopeo/blob/main/install.md
本节安装实践环境将在Ubuntu 20.04 LTS 以及 docker 20.10.12 中进行实践源码编译以及 apt 仓库源下载安装实践。
1.源码编译(静态)
描述: 要构建 skopeo 二进制文件您至少需要 Go 1.12 版本以上, 其次构建 skopeo 有两种方法,即在容器中或者在本地环境中构建(安装环境较为复杂), 此处为了方便演示将采用容器方式进行编译构建。
# 1.拉取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' skopeo/Makefile
# 2.下载镜像构建依赖
$ sudo apt-get install go-md2man # 构建手册依赖于 go-md2man。
$ whereis go-md2man # 获得本机中go-md2man路径。
# 3.构建静态二进制文件
$ 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='
# CGO_CFLAGS="" CGO_LDFLAGS="" GO111MODULE=on go build -mod=vendor -ldflags '-X main.gitCommit=df4d82b960572c19e9333381a203c0ac475766d7 ' -gcflags "" -tags "containers_image_openpgp" -o bin/skopeo ./cmd/skopeo
# 4.运行编译生成的skopeo可执行文件
$ cd ./bin # /opt/software/skopeo/bin
$ ./skopeo --help
# Various operations with container images and container image registries
# .......
# Use "skopeo [command] --help" for more information about a command.
构建关键参数解析:
-
CGO_ENABLED=0 : 设置该环境变量, 禁用 CGO 会导致 Go 在可能的情况下更喜欢静态连接库,而不是动态链接到系统库 (解决可以在Ubuntu或者其它linux发行版中执行编译后二进制文件)。
-
GOPROXY=https://goproxy.cn,direct : Golong 依赖下载镜像站,加快go get依赖拉拉取。
-
BUILDTAGS=containers_image_openpgp : 设置该make参数消除了对libgpgme 及其配套库的依赖, Skopeo 的一些特性依赖于非 Go 库,例如 libgpgme 和 libdevmapper。
-
GO_DYN_FLAGS= : 清空该make参数 (否则会强制创建动态可执行文件)
2.分发包安装
描述: skopeo 可能已经打包在您的发行版中,此处以ubuntu 20.04为例进行安装。
# 1.只支持 Ubuntu 20.10 and newer 发行版
sudo apt-get -y update
sudo apt-get -y install skopeo
# 2.但 Kubic 项目为 Ubuntu 20.04 提供了软件包,我们可以通过如下方式在我们及其上进行安装。
. /etc/os-release
echo "deb https://download.opensuse.org/repositories/devel:/kubic:/libcontainers:/stable/xUbuntu_${VERSION_ID}/ /" | sudo tee /etc/apt/sources.list.d/devel:kubic:libcontainers:stable.list
curl -L https://download.opensuse.org/repositories/devel:/kubic:/libcontainers:/stable/xUbuntu_${VERSION_ID}/Release.key | sudo apt-key add -
sudo apt-get update
sudo apt-get -y upgrade
sudo apt-get -y install skopeo
3.容器安装运行
Skopeo 容器镜像可在 quay.io/skopeo/stable:latest 获得, 例如我们采用podman命令进行如下操作:
podman run docker://quay.io/skopeo/stable:latest copy --help
0x02 快速上手
1.命令浅析
描述: skopen 是操作各种容器映像和容器映像仓库的工具,其使用方法及其可用命令如下:
./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 目标仓库
迁移脚本:
for i in $(less xxx.txt)
do
echo $i;newtag=$(echo $i|sed 's/pxx.ccc.com/harbor-xxx.xxx.com\/dag/g');skopeo --insecure-policy copy docker://$i docker://$newtag;date;
done
|
(责任编辑:liangzh) |