8

我目前正在使用Codefresh 的免费私人注册表来存储我的图像。我正在为我的 Docker 构建使用 CircleCI,所以我从那里使用docker login,以便我可以推送和拉取 Codefresh 注册表。这工作正常。但是,Codefresh 仅在其网络应用程序中列出了它为其构建的图像,因此我无法轻松查看它们的目录。我怀疑这是设计使然,因此用户坚持使用 Codefresh for CI。但是,如果可能的话,我想列出我在注册表中的图像。

我假设这个注册表是标准 Docker Registry 的基本 v2 版本。所以,我四处寻找,发现了这个控制台实用程序来管理图像。但是,它似乎对我不起作用。我不知道这是否是因为注册表管理工具总体上仍然不成熟(网络搜索表明它们是在很久以后才添加的,而且对于很多人来说,这个简单的任务已成为一项艰巨的任务)或者是否有一些不寻常的东西代码新鲜。

这是我正在尝试的:

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 

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

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

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

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

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

更新

看起来 Codefresh也有自己的 API,尽管据我所知似乎没有记录。运行该get操作会产生此错误:

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

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

更新 2

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

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

但是我收到此错误:

{"status":401,"code":"2401","name":"UNAUTHORIZED_ERROR","message":"无法验证请求,因为令牌无效","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
4

3 回答 3

3

您需要首先在 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

这将为您返回一个大令牌

{"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 '用户代理:ItsMe' -H '授权:基本' --compressed ' https://r.cfcr.io/v2/token?account=xxxx&scope=注册表%3Acatalog%3Asearch&service=r.cfcr.io '

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

Edit-1:获取目录

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

每次回购

编辑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
于 2017-10-24T10:45:30.543 回答
2

我有一个部分答案,我认为它本身对其他面临同样困难的人来说已经足够有用了。我通过 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 访问注册表的开放标准,我的支持联系人这样说:

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

用户名是您在 Codefresh 的用户名。密码是您可以在 Codefresh 注册表部分的用户设置 ->“生成”按钮处生成的令牌。

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

于 2017-10-24T09:46:22.957 回答
2

不幸的是,不能对 Codefresh Registry 使用searchcatalog命令。Codefresh 注册中心 ( r.cfcr.io) 基于 Google Container Registry (aka GCR ),而 Google Registry 不实现v1Docker 注册中心 API 和_catalog功能。

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

于 2017-10-24T15:35:04.213 回答