如何在Codefresh私人registry中列出Docker镜像?

我目前使用Codefresh的免费私人registry来存储我的图像。 我为我的Docker构build使用CircleCI,所以从那里我使用docker login因此我可以推送到Codefreshregistry。 这工作正常。 但是,Codefresh只在其应用程序的web应用程序中列出了图像,所以我不能轻易看到它们的目录。 我怀疑这是由devise,以便用户坚持与CI的Codefresh。 但是,如果可能的话,我想列出我在registry中的图像。

我假设这个registry是标准Docker Registry的基本v2版本。 所以,我有一个寻找,并find这个控制台实用程序来pipe理图像。 但是,它似乎并没有为我工作。 我不知道这是否是因为registrypipe理工具一般还不成熟(networkingsearch表明它们被添加得太晚了,而且这个简单的任务已经成为很多人的工作)或者是否有不寻常的Codefresh。

这是我正在尝试的:

 reg -d -r r.cfcr.io -u myusername -p cfaccesstoken 

-d用于debugging)。

这导致:

 2017/10/18 11:24:43 registry.ping url=https://r.cfcr.io/v2/ 2017/10/18 11:24:44 registry.catalog url=https://r.cfcr.io/v2/_catalog 2017/10/18 11:25:53 registry.catalog url=https://r.cfcr.iohttps://r.cfcr.io/v2/_catalog?n=1000&last=davigsantos/davigsantos/codeflix FATA[0075] Get https://r.cfcr.iohttps//r.cfcr.io/v2/_catalog?n=1000&last=davigsantos/davigsantos/codeflix: dial tcp: lookup r.cfcr.iohttps on 127.0.1.1:53: no such host 

倒数第二行包含一个我不认识的容器名 – 我希望它是公开的,而不是我不应该看到的!

最后一行表示某种致命的错误,将各种URL片段混合在一起,这种方式绝对不行。

我也发现删除访问令牌没有区别; 输出是完全一样的:

 reg -d -r r.cfcr.io -u myusername 

我还有什么可以尝试? 我正在运行Mint Linux,如果有必要的话可以交换另一个实用程序。 我发出这个命令的方式有什么问题,或者Codefresh是否运行与标准API调用不兼容的非标准registry?

更新

它看起来像Codefresh 也有自己的API ,尽pipe它似乎没有被logging,据我所知。 运行get操作会产生这个错误:

无法validation请求,因为没有提供令牌

这是令人鼓舞的,所以我会试着找出如何在curl调用中提供一个令牌; Swagger Web界面似乎不允许它。 但是我意识到,如果我可以使API工作,它可能不会列出我的Docker图像,因为它们不是由Codefresh构build的。

更新2

我在Codefresh博客上发现了一些提示如何在API上进行身份validation的文章,格式是这样的头文件:

 --header "x-access-token: (token)" 

但是我得到这个错误:

{“status”:401,“code”:“2401”,“name”:“UNAUTHORIZED_ERROR”,“message”:“无法validation请求,因为令牌无效”,“context”:{}}

我使用的令牌和我用于docker login 。 我注意到我没有指定我的用户名,所以我也添加这个curl选项:

 -u (user):(token) 

正如你所看到的,我现在接近尝试随机的东西,因为似乎没有官方的在线帮助。

更新3

在下面的评论提示下,似乎Docker在使用login后维护一个访问令牌,在~/.docker/config.json

所以我试了这个:

 reg -d -r r.cfcr.io -u myusername -p dockeraccesstoken 

(请注意cfaccesstoken如何更改为dockeraccesstoken )。

现在这个返回速度要快得多(而不是挂起),但是什么都不返回:

 2017/10/24 10:56:16 registry.ping url=https://r.cfcr.io/v2/ 2017/10/24 10:56:18 registry.catalog url=https://r.cfcr.io/v2/_catalog Repositories for r.cfcr.io 

您需要先在CodeFresh用户设置上生成一个令牌

Docker令牌

接下来,我会告诉你如何从terminallogin

 curl -H 'Host: r.cfcr.io' -H 'User-Agent: ItsMe' -H 'Authorization: Basic <AUTH>' --compressed 'https://r.cfcr.io/v2/token?account=xxxx&scope=repository%3A<user>/<name>%3Apush%2Cpull&service=r.cfcr.io' 

您可以通过运行来获取<AUTH>

 echo <account>:<token> | base64 

这会给你一个大的代价

 {"expires_in":43200,"issued_at":"2017-10-24T03:34:54.118390368-07:00","token":"APMm...P91"}% 

现在,您可以使用该令牌进行Docker API调用

 $ curl -IH 'Host: r.cfcr.io' -H 'User-Agent: ItsMe' -H 'Authorization: Bearer APMm+...aRL' -X HEAD 'https://r.cfcr.io/v2/<user>/<user>/testci/blobs/sha256:c7fefcc4c54c63f32b5422ede095793eb5ff0f45ad7a22861974ec9b61e7749b' HTTP/1.1 200 OK Docker-Distribution-API-Version: registry/2.0 Content-Length: 22488057 Date: Tue, 24 Oct 2017 10:42:23 GMT Content-Type: text/html Server: Docker Registry X-XSS-Protection: 1; mode=block X-Frame-Options: SAMEORIGIN 

以下registrysearch访问应该已经工作

curl -H'主机:r.cfcr.io'-H'用户代理:ItsMe'-H'授权:基本'–compressed'https://r.cfcr.io/v2/token?account=xxxx&scope =registry%3Acatalog%3Asearch&service = r.cfcr.io '

但它不,也没有registry:catalog:*为范围。 这就像打了一个盲目的目标,甚至不知道我们站在哪个方向。 你最好打赌是让他们向你透露一些信息

编辑1:获取目录

所以我终于设法破解它,但结果有点不幸。 我最终得到每个用户的目录/存储库。 你想让我发布解决scheme吗? 或者你想先通知他们? 我查过了,你还是不能拉那些回购。 所以他们的docker图像是安全的

EveryRepo

编辑-2:2017年11月17日 – 获取所有回购

需要先使用下面的方法生成一个令牌

 curl -H 'Host: r.cfcr.io' -H 'User-Agent: MyAgent' -H 'Authorization: Basic .....' --compressed 'https://r.cfcr.io/v2/token?account=<account>&service=r.cfcr.io' 

然后使用相同的,我们可以查询完整的目录

 curl -H "User-Agent: ItsMe" -H 'Authorization: Bearer <TOKEN>' 'https://r.cfcr.io/v2/_catalog?n=10' --compressed 

不幸的是Codefresh Registry不能使用searchcatalog命令。 Codefreshregistry( r.cfcr.io )基于Google容器registry( r.cfcr.io ),Googleregistry( r.cfcr.io )基于Google容器registry( r.cfcr.io ),Googleregistry不执行v1 DockerregistryAPI和_catalog函数。

一旦他们这样做了,Codefresh Registry也会有效。

我有一个部分的答案,我认为它对于接近同样困难的其他人来说是足够有用的。 我通过Codefresh的支持页面上的聊天小部件获得了一些帮助。

专有的API

关于Codefresh API,我没有发现域g.codefresh.io和他们的控制面板是一样的。 所以,要进行身份validation,我所要做的就是login控制面板 – 哎呀! 这揭示了对https://g.codefresh.io/api/images的调用,以及比我一直使用的更复杂的访问令牌 – 可能是OAuth。 它看起来像这样:

 curl \ -X GET \ --header "Accept: application/json" \ --header "x-access-token: (36chars).(143chars).(22chars)-(4chars)-(15chars)" \ "https://g.codefresh.io/api/images" 

正如我在问题中所考虑的那样,它看起来像/api/images端点仅用于Codefresh构build。 所以,这对我来说 – 我希望在registry中的一切。

打开API

所以,转向Docker的开放标准访问registry,我的支持联系人说:

如果你想通过docker CLI连接到cfcr.io,你可以。

用户名是您在Codefresh的用户名。 密码是您可以在Codefreshregistry部分的用户设置 – >“生成”button中生成的令牌。

这就是我迄今为止所做的,它适用于loginpush 。 它似乎并不适用于ls模式的reg工具。 要么我仍然在做一些错误的事情,要么在Codefresh上有关于如何使用私有registry的限制。

Interesting Posts