如何在Codefresh私有注册表中列出Docker镜像?

时间:2017-10-18 10:42:46

标签: docker docker-registry

我目前正在使用Codefresh's free private registry来存储我的图片。我使用CircleCI作为我的Docker构建,所以从那里我使用docker login所以我可以推送到Codefresh注册表。这很好用。但是,Codefresh仅在其Web应用程序中列出了它为其构建的图像,因此我无法轻松查看它们的目录。我怀疑这是设计的,所以用户坚持使用Codefresh进行CI。但是,如果可能的话,我想列出我在注册表中的图像。

我认为这个注册表是标准Docker Registry的基本v2版本。所以,我一直在寻找,found this console utility来管理图像。但是,它似乎对我不起作用。我不知道这是否是因为注册管理工具一般还不成熟(网络搜索表明它们后来被添加了很多,并且有很多人为这个简单的任务做了大量工作)或者是否有什么东西与Codefresh不同。

以下是我的尝试:

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

-d用于调试)。

这导致:

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 

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

最后一行表示某种致命的错误,各种各样的网址碎片以绝对无法正常工作的方式混合在一起。

我还发现删除访问令牌没有区别;输出完全相同:

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

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

更新

它看起来像Codefresh also has their own API,尽管据我所知,它似乎没有记录。运行get操作会产生此错误:

  

由于未提供令牌,因此无法对请求进行身份验证

这令人鼓舞,所以我将尝试找出如何在卷曲电话中提供令牌; Swagger Web界面似乎不允许它。但是我意识到,如果我可以使API工作,它可能无法列出我的Docker图像,因为它们不是由Codefresh构建的。

更新2

我在Codefresh博客上发现了一些文章,提示如何在API上进行身份验证,格式是标题:

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

但是我收到了这个错误:

  

{"状态":401,"代码":" 2401""名称":" UNAUTHORIZED_ERROR" ,"消息":"无法对请求进行身份验证,因为令牌无效"," 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

3 个答案:

答案 0 :(得分:3)

您需要先在CodeFresh用户设置

上生成令牌

Docker token

接下来,我将向您展示如何从终端

登录
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

对于注册表搜索,下面应该有效

  

curl -H'主持人:r.cfcr.io'-H'User-Agent:ItsMe'-H'授权:基本' - 压缩'https://r.cfcr.io/v2/token?account=xxxx&scope=registry%3Acatalog%3Asearch&service=r.cfcr.io'

但它没有,registry:catalog:*也没有范围。这就像用盲目的褶皱撞击目标,甚至不知道我们站在哪个方向。您最好的选择是让他们向您披露一些信息

编辑-1:获取目录

所以我终于设法破解它,但结果有点不幸。我最终获得了每个用户的目录/存储库。我检查过,你仍然无法拉回那些回购。所以他们的码头图像是安全的。这些看起来像这样:

EveryRepo

编辑-2:获取所有回购

在我们通知Codefresh这种情况后,这里是如何进行获取。首先需要使用以下内容生成令牌:

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

答案 1 :(得分:2)

不幸的是,它无法对Codefresh Registry使用searchcatalog命令。 Codefresh注册表(r.cfcr.io)基于Google Container Registry(又名 GCR ),Google Registry未实现v1 Docker注册表API和_catalog功能。< / p>

一旦他们这样做,事情也适用于Codefresh Registry。

答案 2 :(得分:1)

我有一个部分答案,我认为对于遇到同样困难的其他人来说,这本身就足够了。我在Codefresh的支持页面上通过聊天小部件得到了一些帮助。

专有API

关于Codefresh API,我没有发现域g.codefresh.io与其控制面板相同。因此,要进行身份验证,我所要做的就是登录控制面板 - 哎呀!这显示了对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构建。所以,这对我来说 - 我想要在注册表中的所有内容。

Open API

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

  

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

     

用户名是Codefresh的用户名。密码是您可以在用户设置下生成的令牌 - &gt; &#34; GENERATE&#34; Codefresh注册表部分的按钮。

这是我迄今为止所做的工作,适用于loginpushpull。但它似乎不适用于reg模式下的ls实用程序。要么我还在做错事,要么Codefresh对如何使用私人注册表有限制。