使用 podman 推送数据到私有仓库的 3 个问题记录
写在前面,什么是 podman
因为公司不让用 docker,所以可以理解为 podman 是 docker 的替代。
Podman 设计上是兼容 Docker 的,这意味着你可以用 Podman 替代 Docker,而不需要对现有的Docker环境或脚本做太多改变。
场景:推送镜像到私有仓库,报了如下三个错误,记录一下
podman push xxxxxxx
- 问题 1:
Error: trying to reuse blob sha256:e0781bc8667fb5ebf954df4ae52997f6f5568ec9f07e21e5db7c9d324ed41e1f at destination: pinging container registry harbor.xxxx.xxxx.xxxx.xxxx: Get "https://harbor.xxxx.xxxx.xxxx.xxxx/v2/": tls: failed to verify certificate: x509: certificate relies on legacy Common Name field, use SANs instead
- 问题 1 的解决方案:增加参数
--tls-verify=false
解决了该问题
-
问题 2:
Error: writing blob: initiating layer upload to /v2/xxxx/blobs/uploads/ in harbor.xxxx.xxxx.xxxx.xxxx: requested access to the resource is denied
-
问题 2 的解决方案:需要先登录
podman login harbor.xxxx.xxxx.xxx.xxxx -u xxxxxxxx -p xxxxxxxx
- 问题 3:
Error: writing manifest: uploading manifest 7.4.0 to harbor.xxxx.xxxx.xxxx.xxxx/xxxxxx: manifest invalid
- 问题 3 的解决方案:增加参数
--format v2s2
解决了该问题
--format v2s2
的解释
问题 3 中提到的错误是关于上传容器镜像到 Harbor 仓库时的问题。错误信息提示上传的镜像清单(manifest)无效。解决方法是增加 --format v2s2
参数。
- format 参数的选择:Docker 镜像格式通常有两种选择,分别是 v2s1 和 v2s2:
- v2s1(Schema 1):是 Docker Registry HTTP API V2 的早期版本,已经不推荐使用。
- v2s2(Schema 2):是推荐的现代格式,提供了更多的特性和改进。
这两种格式的含义:
v2s1(Schema 1):它是 Docker 镜像分发的第一个版本,支持签名,但缺乏其他一些功能,例如内容寻址和多平台镜像支持。
v2s2(Schema 2):这个版本添加了一些重要的功能,例如内容寻址,这样可以通过校验和来验证镜像的完整性,同时支持多架构镜像和清单列表。
为何会报错:
报错可能是因为 Harbor 仓库配置为只接受 Schema 2 的镜像格式,而尝试上传的镜像可能是旧的 Schema 1 格式,或者镜像清单文件有其他问题。通过明确指定 --format v2s2
,确保上传的是兼容的镜像格式,从而解决了问题。
最终的命令
podman push xxxxxxx --tls-verify=false --format v2s2