1

我想知道是否可以为 Docker 命令的远程注册表提供凭据,例如docker pull ... <image>docker run ... <image>不首先使用docker login

原因是我想像在 HTTP Basic Auth 中一样提供凭据(内联),这样我就不必创建~/.docker/config.json.

尝试<username>:<password>@<image>似乎不起作用,至少对我来说。

4

1 回答 1

2

这可以使用 Docker HTTP API viacurl或等效方法来实现。

查看官方文档:https ://docs.docker.com/engine/api/v1.39/#operation/ImageCreate

Engine API 是一个由 Docker Engine 提供的 HTTP API。它是 Docker 客户端用来与 Engine 通信的 API,因此 Docker 客户端可以做的所有事情都可以通过 API 完成。

大多数客户端的命令直接映射到 API 端点(例如 docker ps 是 GET /containers/json)。值得注意的例外是运行容器,它由几个 API 调用组成。

逆向工程

首先创建一个用于检查docker客户端请求的 Unix 套接字:

socat -v UNIX-LISTEN:/tmp/fake,fork UNIX-CONNECT:/var/run/docker.sock

接下来,使用docker客户端运行docker pull ...

docker -H unix:///tmp/fake pull db-docker-xsrt-rt.artifactory.example.net/aquasec/kube-hunter

docker客户端和dockerd服务器之间发送的 HTTP 流量:

> 2021/04/13 12:42:21.445593  length=80 from=0 to=79
GET /_ping HTTP/1.1\r
Host: docker\r
User-Agent: Docker-Client/18.09.6 (linux)\r
\r
< 2021/04/13 12:42:21.446085  length=212 from=0 to=211
HTTP/1.1 200 OK\r
Api-Version: 1.39\r
Docker-Experimental: false\r
Ostype: linux\r
Server: Docker/18.09.6 (linux)\r
Date: Tue, 13 Apr 2021 10:42:21 GMT\r
Content-Length: 2\r
Content-Type: text/plain; charset=utf-8\r
\r
OK> 2021/04/13 12:42:21.447291  length=401 from=80 to=480
POST /v1.39/images/create?fromImage=db-docker-xsrt-rt.artifactory.example.net%2Faquasec%2Fkube-hunter&tag=latest HTTP/1.1\r
Host: docker\r
User-Agent: Docker-Client/18.09.6 (linux)\r
Content-Length: 0\r
Content-Type: text/plain\r
X-Registry-Auth: <redacted>\r
\r
< 2021/04/13 12:42:21.546168  length=352 from=212 to=563
HTTP/1.1 200 OK\r
Api-Version: 1.39\r
Content-Type: application/json\r
Docker-Experimental: false\r
Ostype: linux\r
Server: Docker/18.09.6 (linux)\r
Date: Tue, 13 Apr 2021 10:42:21 GMT\r
Transfer-Encoding: chunked\r
\r
3d\r
{"status":"Pulling from aquasec/kube-hunter","id":"latest"}\r
\r
45\r
{"status":"Already exists","progressDetail":{},"id":"801bfaa63ef2"}\r
\r
< 2021/04/13 12:42:21.552481  length=811 from=564 to=1374
...

相关部分如下,其中通过HTTP 标头~/docker/config.json提供 Base64 编码的凭据:X-Registry-Auth

POST /v1.39/images/create?fromImage=db-docker-xsrt-rt.artifactory.example.net%2Faquasec%2Fkube-hunter&tag=latest HTTP/1.1\r
Host: docker\r
User-Agent: Docker-Client/18.09.6 (linux)\r
Content-Length: 0\r
Content-Type: text/plain\r
X-Registry-Auth: <redacted>\r
\r

解码该X-Registry-Auth值会产生类似(已编辑)的内容:

echo <redacted> | base64 -d
{"username":"<redacted","password":"<redacted>","serveraddress":"db-docker-xsrt-rt.artifactory.example.net"}
于 2021-04-13T11:01:21.197 回答