帝游网提供最新手游APP下载和游戏攻略!

高效镜像同步:skopeo在不同仓库间的同步解决方案

发布时间:2024-10-21浏览:23

大家好,如果您还对高效镜像同步:skopeo在不同仓库间的同步解决方案不太了解,没有关系,今天就由本站为大家分享高效镜像同步:skopeo在不同仓库间的同步解决方案的知识,包括的问题都会给大家分析到,还望可以解决大家的问题,下面我们就开始吧!

skopeo 使用 API V2 Registry,例如 Docker Registry、Atomic Registry、私有Registry、本地目录和本地 OCI 镜像目录。skopeo 不需要运行守护进程,它可以执行的操作包括:

  • 检测远程镜像并查看其属性
  • 从镜像库中删除镜像
  • 查看镜像所有tag

项目地址

Github 官方地址: https://github.com/containers/skopeo

解决痛点

假如有如下场景,我们从dockerhub公共仓库中下载一个GB以上的镜像,到本地的私有仓库中,我想通常你会这样做先docker pull 到本地,然后使用docker tag更改为私有仓库地址加上镜像名称版本,最后再使用docker push上传镜像到私有仓库中,以供其它内网机器拉取并使用。虽然该方法是可行,但是如果有多个大于GB以上的镜像需要上传到私有仓库,每次都要先解压layer到本地,然后再压缩layer上传到私有仓库中,这是一个很浪费时间的过程。skope工具刚好用来节省这一操作的时间,可以用来替代 docker-cli 来搬运镜像。

安装

Skopeo 官方安装&编译方式参考文档:

https://github.com/containers/skopeo/blob/main/install.md

  • 编译安装

使用nixos/nix镜像进行编译:实测这种方式最靠谱,本地编译可能出现各种依赖问题

$ git clone https://github.com/containers/skopeo.git$ cd skopeo$ sed -i 's#proxy.golang.org#https://goproxy.cn#g' Makefile#使用 nixos/nix:2.3.12 来构建静态链接的 Skopeo 二进制文件需要完整构建 Skopeo 所有的依赖,比如 glibc、systemd、golang 等,所以构建十分耗时。在一台 4c8G 的机器上构建用了将近半个小时$ BUILD_IMAGE=nixos/nix:2.3.12$ docker run --rm -t -v $PWD:/build ${BUILD_IMAGE} \sh -c "cd /build && nix build -f nix && cp ./result/bin/skopeo skopeo"
  • 在线安装

centos/fedora:

yum install skopeo

注意:安装的可能不是最新的版本,有些功能可能不可用,比如list-tags,所以还是建议编译安装

使用

在使用 skopeo 前如果 src 或 dest 镜像是在 registry 仓库中的并且配置了非 public 的镜像需要相应的 auth 认证, 此时我们需要使用 docker login 或者 skopeo login 的方式登录到 registry 仓库,然后默认会在~/.docker目录下生成 registry 登录配置文件 config.json ,该文件里保存了登录需要的验证信息,skopeo 拿到该验证信息才有权限往 registry 拉取或者推送镜像。

# (1) skopeo login 登陆示例skopeo login -u wuqy -p testpassword hub.easyops.local# (2) docker login 登陆示例docker login -u wuqy docker.iodocker login -u wuqy hub.easyops.localdocker login -u anonymous -p anonymous 192.168.1.79:5000# (3) docker login 生成的 registry 登录配置文件cat ~/.docker/config.json{ "auths": { "192.168.1.79:5000": { "auth": "YW5v*******Q==" }, "hub.easyops.local": { "auth": "YWR*******LkA=" }, "https://index.docker.io/v1/": { "auth": "d2Vp**************kyZA==" } }}

注销认证:

skopeo logout 192.168.1.79:5000

如果企业自建harbor仓库(一般都会设置自签证书)或者其它私有仓库配置证书,为了防止出错建议进行以下操作(正式环境请根据需要进行配置)。

  • 方式一

在 /etc/docker/daemon.json 中配置insecure-registries字段,表示允许不安全的仓库。

"insecure-registries": ["hub.easyops.local","192.168.1.79:5000"]
  • 方式二

从官方文档可知客户端要使用tls与Harbor通信使用的还是`自签证书`,那么必须建立一个目录:

mkdir -vp /etc/docker/certs.d/hub.easyops.localcp -a /deployapp/harbor/harbor.pem /etc/docker/certs.d/hub.easyops.local/harbor.crtsystemctl restart docker

为了防止后续执行skopeo命令操作镜像时出错, 建议忽略policy策略和证书校验,参数如下:

--insecure-policy \--src-tls-verify=false \ --dest-tls-verify=false \

2. 检查存储库中的镜像

skopeo 能够检查容器Registry上的存储库并获取镜像层。检查命令获取存储库的清单,它能够向您显示有关整个存储库或标签的类似 docker inspect 的 json 输出。与 docker inspect 相比,此工具可帮助您在拉取存储库或标签之前收集有用的信息(使用磁盘空间), 检查命令可以向您显示给定存储库可用的标签、映像具有的标签、映像的创建日期和操作系统等。

支持传输的类型 : containers-storage, dir, docker, docker-archive, docker-daemon, oci, oci-archive, ostree, tarball

显示 busybox:latest 镜像的属性相关信息:

$ skopeo inspect docker://docker.io/busybox:latest{ "Name": "docker.io/library/busybox", "Digest": "sha256:5acba83a746c7608ed544dc1533b87c737a0b0fb730301639a0179f9344b1678", "RepoTags": [ "1", "1-glibc", "1-musl", "1-ubuntu", "1-uclibc", "1.21-ubuntu", "1.21.0-ubuntu", ....... # 镜像历史tags "unstable-uclibc" ], "Created": "2021-12-30T19:19:41.006954958Z", "DockerVersion": "20.10.7", "Labels": null, "Architecture": "amd64", "Os": "linux", "Layers": [ "sha256:5cc84ad355aaa64f46ea9c7bbcc319a9d808ab15088a27209c9e70ef86e5a2aa" ], "Env": [ "PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin" ]}

显示 busybox:latest 镜像的容器配置相关信息:

$ skopeo inspect --config docker://docker.io/busybox:latest | jq{ "created": "2021-12-30T19:19:41.006954958Z", "architecture": "amd64", "os": "linux", "config": { "Env": [ "PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin" ], "Cmd": [ "sh" ] }, "rootfs": { "type": "layers", "diff_ids": [ "sha256:01fd6df81c8ec7dd24bbbd72342671f41813f992999a3471b9d9cbc44ad88374" ] }, "history": [ { "created": "2021-12-30T19:19:40.833034683Z", "created_by": "/bin/sh -c #(nop) ADD file:6db446a57cbd2b7f4cfde1f280177b458390ed5a6d1b54c6169522bc2c4d838e in / " }, { "created": "2021-12-30T19:19:41.006954958Z", "created_by": "/bin/sh -c #(nop) CMD [\"sh\"]", "empty_layer": true } ]}

查询镜像摘要Digest:

$ skopeo inspect --format "Name: {{.Name}} Digest: {{.Digest}}" docker://docker.io/busybox:latest

3. 仓库镜像拷贝

利用该命令我们可以列出 registry 上的某个镜像的所有 tag ,这个功能很有用,因为有时我们不知道一个镜像目前有哪些tag,不加tag的话默认就是latest,这个不是一个好的选择。

比如我们要查看busybox这个镜像目前有哪些tag用下面的命令:

$ skopeo list-tags docker://docker.io/busybox{ "Repository": "docker.io/library/busybox", "Tags": [ "1", "1-glibc", "1-musl", "1-ubuntu", "1-uclibc", "1.21-ubuntu", "1.21.0-ubuntu", "1.23", "1.23.2", "1.24", "1.24-glibc", "1.24-musl", "1.24-uclibc", "1.24.0", "1.24.1", "1.24.1-glibc", "1.24.1-musl", "1.24.1-uclibc", "1.24.2", "1.24.2-glibc", "1.24.2-musl", "1.24.2-uclibc", "1.25", "1.25-glibc", "1.25-musl", "1.25-uclibc", "1.25.0", "1.25.0-glibc", "1.25.0-musl", "1.25.0-uclibc", "1.25.1", "1.25.1-glibc", "1.25.1-musl", "1.25.1-uclibc", "1.26", "1.26-glibc", "1.26-musl", "1.26-uclibc", "1.26.0", "1.26.0-glibc", "1.26.0-musl", "1.26.0-uclibc", "1.26.1", "1.26.1-glibc", "1.26.1-musl", "1.26.1-uclibc", "1.26.2", "1.26.2-glibc", "1.26.2-musl", "1.26.2-uclibc", "1.27", "1.27-glibc", "1.27-musl", "1.27-uclibc", "1.27.0", "1.27.0-glibc", "1.27.0-musl", "1.27.0-uclibc", "1.27.1", "1.27.1-glibc", "1.27.1-musl", "1.27.1-uclibc", "1.27.2", "1.27.2-glibc", "1.27.2-musl", "1.27.2-uclibc", "1.28", "1.28-glibc", "1.28-musl", "1.28-uclibc", "1.28.0", "1.28.0-glibc", "1.28.0-musl", "1.28.0-uclibc", "1.28.1", "1.28.1-glibc", "1.28.1-musl", "1.28.1-uclibc", "1.28.2", "1.28.2-glibc", "1.28.2-musl", "1.28.2-uclibc", "1.28.3", "1.28.3-glibc", "1.28.3-musl", "1.28.3-uclibc", "1.28.4", "1.28.4-glibc", "1.28.4-musl", "1.28.4-uclibc", "1.29", "1.29-glibc", "1.29-musl", "1.29-uclibc", "1.29.1", "1.29.1-glibc", "1.29.1-musl", "1.29.1-uclibc", "1.29.2", "1.29.2-glibc", "1.29.2-musl", "1.29.2-uclibc", "1.29.3", "1.29.3-glibc", "1.29.3-musl", "1.29.3-uclibc", "1.30", "1.30-glibc", "1.30-musl", "1.30-uclibc", "1.30.0", "1.30.0-glibc", "1.30.0-musl", "1.30.0-uclibc", "1.30.1", "1.30.1-glibc", "1.30.1-musl", "1.30.1-uclibc", "1.31", "1.31-glibc", "1.31-musl", "1.31-uclibc", "1.31.0", "1.31.0-glibc", "1.31.0-musl", "1.31.0-uclibc", "1.31.1", "1.31.1-glibc", "1.31.1-musl", "1.31.1-uclibc", "1.32", "1.32-glibc", "1.32-musl", "1.32-uclibc", "1.32.0", "1.32.0-glibc", "1.32.0-musl", "1.32.0-uclibc", "1.32.1", "1.32.1-glibc", "1.32.1-musl", "1.32.1-uclibc", "1.33", "1.33-glibc", "1.33-musl", "1.33-uclibc", "1.33.0", "1.33.0-glibc", "1.33.0-musl", "1.33.0-uclibc", "1.33.1", "1.33.1-glibc", "1.33.1-musl", "1.33.1-uclibc", "1.34", "1.34-glibc", "1.34-musl", "1.34-uclibc", "1.34.0", "1.34.0-glibc", "1.34.0-musl", "1.34.0-uclibc", "1.34.1", "1.34.1-glibc", "1.34.1-musl", "1.34.1-uclibc", "1.35", "1.35-glibc", "1.35-musl", "1.35-uclibc", "1.35.0", "1.35.0-glibc", "1.35.0-musl", "1.35.0-uclibc", "1.36", "1.36-glibc", "1.36-musl", "1.36-uclibc", "1.36.0", "1.36.0-glibc", "1.36.0-musl", "1.36.0-uclibc", "1.36.1", "1.36.1-glibc", "1.36.1-musl", "1.36.1-uclibc", "buildroot-2013.08.1", "buildroot-2014.02", "glibc", "latest", "musl", "stable", "stable-glibc", "stable-musl", "stable-uclibc", "ubuntu", "ubuntu-12.04", "ubuntu-14.04", "uclibc", "unstable", "unstable-glibc", "unstable-musl", "unstable-uclibc" ]}

5. podman镜像同步示例

从registry.redhat.io同步redhat-operator-index:v4.12镜像到私有仓库hub.easyops.local的ocp-poc项目下面

podman login registry.redhat.iopodman login hub.easyops.localskopeo copy --all --authfile /run/containers/0/auth.json docker://registry.redhat.io/redhat/redhat-operator-index:v4.12 docker://hub.easyops.local/ocp-poc/redhat/redhat-operator-index:v4.12

注:--all同步所有架构

6. 批量镜像同步最佳实践

准备一个镜像列表 images-list.txt:

$ images-list.txt$ cat<<'EOF' >images-list.txtprom/pushgateway:v1.6.0prom/blackbox-exporter:v0.24.0prom/prometheus:v2.42.0prom/pushgateway:v1.5.0timonwong/prometheus-webhook-dingtalk:v2.1.0prom/alertmanager:v0.24.0EOF

同步脚本:这里以同步到aliyun仓库为例,如需其他根据实际情况修改

#!/bin/bashwhile read linedo echo $line aliline=$(echo $line | awk -F "/" '{print $NF}') echo $aliline echo "skopeo copy --all docker://$line docker://registry.cn-hangzhou.aliyuncs.com/easyopshub/$aliline" skopeo copy docker://$line docker://registry.cn-hangzhou.aliyuncs.com/easyopshub/$alilinedone< images.txt

好了skopeo的使用介绍就到这里,还有更多玩法可以自己再探索下。

原文链接:https://mp.weixin.qq.com/s/B9OZfavrmqZQaKCpuOnmsA

用户评论

优雅的叶子

这篇文章写的挺棒的!我之前一直手动的操作镜像拷贝,非常浪费时间。使用skopeo同步镜像效率高很多啊!

    有6位网友表示赞同!

猫腻

文章讲得清晰易懂,很详细地介绍了如何使用 Skopeo 进行镜像同步。我打算找个空闲时间试一试,看看能不能改善我的镜像管理流程。

    有18位网友表示赞同!

逃避

Skopeos 这个工具真是太厉害了!我现在在多个仓库间操作镜像变得轻松了不少。之前一直担心数据同步问题, Skopeo 真心解决了我的烦恼!

    有16位网友表示赞同!

矜暮

不同仓库间的镜像同步确实是个大难题,幸好找到了这篇博客介绍 Skopeo 的用法,感觉很不错。试用一下看看效果吧!

    有7位网友表示赞同!

無極卍盜

这个工具听起来很有用,但我觉得操作步骤还是有点复杂,对于初学者来说,可能需要一些时间来理解和上手。希望以后能有更图文并茂的教程。

    有7位网友表示赞同!

冷眼旁观i

这篇文章终于解释了 Skopeo 的具体功能!我一直想了解如何利用它进行镜像同步,而且还提供详细的命令示例,太棒了!

    有10位网友表示赞同!

凉城°

我对不同仓库镜像之间的数据管理很是头疼,突然遇到这篇博客就感觉希望来了!一定要试一试 Skopeo 这个工具,看看能不能帮我解决这些问题。

    有8位网友表示赞同!

心安i

虽然文章讲得很清楚,但我觉得实际操作的步骤还是比较繁琐,特别是对于大型镜像库来说。可能需要寻找一些更自动化的方法来进行管理.

    有11位网友表示赞同!

不识爱人心

学习Skopeos 的用法,的确能提高工作效率和降低操作风险!感谢作者分享这个宝贵的经验,我一定会好好学习。

    有8位网友表示赞同!

旧爱剩女

使用 Skopeo 进行镜像同步确实很方便,但要注意安全问题,确保传输过程不被恶意攻击。建议文章可以添加一些关于安全的提示内容。

    有5位网友表示赞同!

此生一诺

镜像同步功能一直是 Docker 生态系统中重要的功能点。Skopeos 能提供一个便捷的解决方案,提升了镜像管理的效率和安全性。感谢作者分享!

    有9位网友表示赞同!

龙卷风卷走爱情

我非常喜欢使用 Skopeo 进行镜像同步,因为它可以帮助我快速更新不同仓库中的镜像版本。不过希望未来可以支持更多镜像是仓库格式。

    有13位网友表示赞同!

拽年很骚

感觉这篇博客对 Skopeo 的介绍过于简略,没有深入讲解一些关键概念和功能细节。我希望能看到更详细的分析和实践案例。

    有16位网友表示赞同!

该用户已上天

我觉得这个工具非常强大,可以帮助我们更好地管理容器镜像仓库。建议进一步探讨如何将 Skopeo 与其他工具集成使用,以构建更完善的运维自动化流程。

    有7位网友表示赞同!

全网暗恋者

我一直在寻找一种高效便捷的方法来进行镜像同步,博客中介绍的 Skopeos 看起来很不错,我会试一试。

    有19位网友表示赞同!

青衫故人

虽然 Skopeo 可以实现镜像同步,但它也有一定的局限性,比如不支持跨平台同步。我希望作者可以进一步分享更多关于 Skopeo 的优势和不足之处,以便大家更好地评估它的适用范围。

    有15位网友表示赞同!

热点资讯