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

How to list Docker images in a Codefresh private registry?

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

我假设此注册表是标准 Docker 注册表的基本 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 

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

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

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

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

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

更新

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

Failed to authenticate request because no token was provided

这令人鼓舞,所以我将尝试找出如何在 curl 调用中提供令牌; Swagger Web 界面似乎不允许这样做。但是我意识到,如果我能让 API 正常工作,它可能不会列出我的 Docker 图片,因为它们不是由 Codefresh 构建的。

更新 2

我在 Codefresh 博客上找到了一些文章,提示如何在 API 上进行身份验证,格式是 header 因此:

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

但是我得到这个错误:

{"status":401,"code":"2401","name":"UNAUTHORIZED_ERROR","message":"Failed to authenticate request because token is not valid","context":{}}

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

-u (user):(token)

如您所见,我现在几乎要尝试随机的东西了,因为在线似乎没有官方帮助。

更新 3

在下面的评论提示下,Docker 在 ~/.docker/config.json.

中使用 login 后似乎维护了一个访问令牌

因此我尝试了这个:

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

(请注意 cfaccesstoken 已更改为 dockeraccesstoken)。

这 returns 现在快多了(与看起来挂起相反),但是 returns 什么都没有:

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 支持页面上的聊天小部件获得了一些帮助。

专有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 构建。所以,这不适合我 - 我想要注册表中的所有内容。

打开API

因此,转向 Docker 访问注册表的开放标准,我的支持联系人是这样说的:

if you want to connect to cfcr.io through docker CLI, you can.

The username is your username at Codefresh. The password is a token you can generate at user settings -> "GENERATE" button at the Codefresh registry section.

这就是我到目前为止所做的,它适用于 loginpushpull。不过,它似乎不适用于 ls 模式下的 reg 实用程序。要么我仍然做错了,要么 Codefresh 对如何使用私有注册表有限制。

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

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

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

这将return你一个大令牌

{"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 'Host: r.cfcr.io' -H 'User-Agent: ItsMe' -H 'Authorization: Basic ' --compressed 'https://r.cfcr.io/v2/token?account=xxxx&scope=registry%3Acatalog%3Asearch&service=r.cfcr.io'

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

Edit-1:获取目录

于是我终于破解了,但是结果有点遗憾。我最终得到了每个用户的 catalog/repositories。我检查过,你仍然无法提取那些回购协议。所以他们的 docker 图像本身是安全的。这些看起来像这样:

Edit-2:获取所有 repos

我们将这种情况通知Codefresh后,下面是如何进行fetch。首先需要使用以下方法生成令牌:

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 命令。 Codefresh 注册中心 (r.cfcr.io) 基于 Google 容器注册中心 (aka GCR) 并且 Google 注册中心没有实现 v1 Docker 注册表 API 和 _catalog 函数。

一旦他们这样做了,Codefresh Registry 也将适用。