簡體   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