繁体   English   中英

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

[英]How to list Docker images in a Codefresh private registry?

我目前正在使用Codefresh 的免费私有注册表来存储我的图像。 我将 CircleCI 用于我的 Docker 构建,所以从那里我使用docker login以便我可以推送和拉取到 Codefresh 注册表。 这工作正常。 但是,Codefresh 仅在其 Web 应用程序中列出了其构建的图像,因此我无法轻松查看它们的目录。 我怀疑这是设计使然,因此用户坚持使用 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

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

Docker 令牌

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

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:*也没有作用域。 这就像盲目折叠击中目标,甚至不知道我们站在哪个方向。 你最好的办法是让他们向你透露一些信息

编辑 1:获取目录

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

每个回购

编辑 2:获取所有存储库

在我们将这种情况通知 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 支持页面上的聊天小部件获得了一些帮助。

专有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 注册表部分的“生成”按钮中生成的令牌。

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

不幸的是,无法对 Codefresh Registry 使用searchcatalog命令。 Codefresh 注册表 ( r.cfcr.io ) 基于 Google Container Registry (aka GCR ) 而 Google Registry 没有实现v1 Docker 注册表 API 和_catalog功能。

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM