首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何在Codefresh私有注册表中列出Docker图像?

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

Stack Overflow用户
提问于 2017-10-18 10:42:45
回答 3查看 1.2K关注 0票数 9

我目前正在使用Codefresh的免费私人注册来存储我的图像。我在我的Docker构建中使用CircleCI,所以我从那里使用docker login,这样我就可以推拉到Codefresh注册中心。这个很好用。然而,Codefresh只在它的web应用程序中列出了它为之设计的图片,所以我很难看到它们的目录。我怀疑这是由设计,所以用户坚持Codefresh为CI。但是,如果可能的话,我想列出我在注册表中的图像。

我假设这个注册表是标准的基本v2版本。所以,我到处找东西,用找到此控制台实用程序来管理图片。然而,这似乎对我不起作用。我不知道这是因为注册表管理工具总体上还不成熟(web搜索表明它们是在很晚才添加的,而且对于许多人来说,这一简单的任务已经成为一项重大任务),还是Codefresh有什么不寻常之处。

以下是我所尝试的:

代码语言:javascript
复制
reg -d -r r.cfcr.io -u myusername -p cfaccesstoken

( -d用于调试)。

这导致:

代码语言:javascript
复制
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片段以肯定无法工作的方式混在一起。

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

代码语言:javascript
复制
reg -d -r r.cfcr.io -u myusername

我还能做什么呢?我正在运行Mint,如果需要的话,可以换到另一个实用程序。我发出这个命令的方式有问题吗,还是Codefresh运行的非标准注册表与标准API调用不兼容?

更新

它看起来像Codefresh 也有自己的API,尽管据我所知,它似乎没有文档化。运行get操作会产生以下错误:

未能验证请求,因为没有提供令牌

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

更新2

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

代码语言:javascript
复制
--header "x-access-token: (token)"

然而,我得到了这个错误:

{“状态”:401,“代码”:“2401”,“名称”:“UNAUTHORIZED_ERROR”,“消息”:“由于令牌无效而无法验证请求”,“上下文”:{}}

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

代码语言:javascript
复制
-u (user):(token)

正如你所看到的,我现在已经接近于尝试随机的事情了,因为网上似乎没有官方的帮助。

更新3

在下面的注释提示下,在使用login之后,在~/.docker/config.json中,Docker似乎维护了一个访问令牌。

因此,我尝试这样做:

代码语言:javascript
复制
reg -d -r r.cfcr.io -u myusername -p dockeraccesstoken

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

现在返回的速度要快得多(而不是挂起),但没有返回任何内容:

代码语言:javascript
复制
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
EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2017-10-24 10:45:30

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

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

代码语言:javascript
复制
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>获得

代码语言:javascript
复制
echo <account>:<token> | base64

这会给你一个很大的象征

代码语言:javascript
复制
{"expires_in":43200,"issued_at":"2017-10-24T03:34:54.118390368-07:00","token":"APMm...P91"}%

现在,您可以使用这个令牌进行一个docker调用。

代码语言:javascript
复制
$ 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‘授权: Basic’-压缩'https://r.cfcr.io/v2/token?account=xxxx&scope=registry%3Acatalog%3Asearch&service=r.cfcr.io

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

编辑-1:获取目录

所以我终于破解了,但结果有点不幸。最后,我得到了每个用户的目录/存储库。我查过了,你还是拿不动那些回购品。所以他们的码头图像是安全的。这些看起来是这样的:

编辑-2:获取所有repos

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

代码语言:javascript
复制
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'

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

代码语言:javascript
复制
curl -H "User-Agent: ItsMe" -H 'Authorization: Bearer <TOKEN>' 'https://r.cfcr.io/v2/_catalog?n=10' --compressed
票数 3
EN

Stack Overflow用户

发布于 2017-10-24 09:46:22

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

专有API

关于Codefresh,我没有发现域g.codefresh.io与他们的控制面板相同。所以,为了验证身份,我所要做的就是登录到控制面板--哎哟!这揭示了对https://g.codefresh.io/api/images的调用,以及比我一直使用的更复杂的访问令牌--也许是OAuth。看起来是这样的:

代码语言:javascript
复制
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连接到cfcr.io,可以。 用户名是您在Codefresh的用户名。密码是您可以在用户设置时生成的标记,->在Codefresh注册表部分的" generate“按钮。

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

票数 2
EN

Stack Overflow用户

发布于 2017-10-24 15:35:04

不幸的是,Codefresh不可能使用searchcatalog命令。Codefresh注册中心(r.cfcr.io)基于(又名GCR),并且Google不实现v1、Docker和_catalog功能。

一旦他们这样做,事情也将在Codefresh注册表工作。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/46808313

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档