mritd/imgsync

tag更新了,该如何同步?

Closed this issue · 5 comments

klgd commented

你好,我fork了你的这个项目,然后试着修改,把gcr.io/google-containers/defaultbackend同步到了dockerhub上
gcrsync是通过name tag对比来同步的,如果有个latest更新了,就无法同步了
后来 我去找了 gcr.io/google-containers/defaultbackend 的digest(tag 1.4是sha256:865b0c35e6da393b8e80b7e3799f777572399a4cff047eb02a81fa6e7a48ed4b
以及通过 https://index.docker.io/v2/xxxx/defaultbackend/manifests/1.4 查看我同步过来的镜像的digest是 sha256:185c45f9b961481b4935fa236dcf9b4dbd3b4ffa374720cdd170164e2f03a3c6
两个digest不一样,这该如果对比?有没有什么方法去同步那些tag被更新的镜像呢?

mritd commented

暂时还不支持同一 tag 不断更新的情况;
事实上这种更新通过代码可以对比出来,然后重新下载,不过这样同步查询进度会很缓慢;
具体后续是否支持取决于 azure 同步是否稳定,如果其长期稳定,本项目可能终止同步,具体请参考 #4

klgd commented

@mritd 可以说一下对比的思路吗?我想同步的不止gcr 还有quay.io,gitlab

mritd commented

本项目主要 API 请求地址都在这里定义 https://github.com/mritd/gcrsync/blob/c13a2293a3d7e3bad76e5ca31c0674fc455765fd/gcrsync/sync.go#L16

不过 对于 docker hub 上实用的并不是标准 API ,在最新文档中你可以通过如下方式获取到某个镜像 tag 的 digest:

# 获取 token(注意返回有两个,不是 access_token 那个字段) 
curl -fsSl https://auth.docker.io/token?service=registry.docker.io&scope=repository:mritd/alpine:pull
# 通过 token 获取镜像信息
curl -H "Authorization: Bearer YOUR_TOKEN" -fsSL https://registry-1.docker.io/v2/mritd/alpine/manifests/latest

同样对于 gcr 镜像你可以直接 curl 获取

curl https://gcr.io/v2/google-containers/busybox/manifests/latest

最后对比差异判断是否需要更新即可,更详细的文档可以参考 https://docs.docker.com/registry/spec/api/

klgd commented

@mritd 非常感谢! 看了一下文档,Manifest V 2, Schema 2格式的都比较容易判断,但是 Schema 1的似乎没办法比对

gitlab registry 可以用 Accept:application/vnd.docker.distribution.manifest.v2+json来指定返回的Schema version,但是gcr的指定accept会报类似以下错误:

Manifest with tag '1.2' has media type 'application/vnd.docker.distribution.manifest.v1+prettyjws', but client accepts 'application/vnd.docker.distribution.manifest.list.v2+json,application/vnd.docker.distribution.manifest.v2+json'.

不是很明白什么意思
另外就是 github.com/docker/docker/client 是否有方法可以直接获取manifest的?

mritd commented

@klgd 重写了一下,目前应该可以支持这种同步了,最近几天还在测试中。