【发布时间】:2017-10-05 02:38:20
【问题描述】:
为了促进我们的应用程序的远程 CICD 过程,我正在尝试访问我们的 Docker Hub/Registry 以便能够列出、标记和推送图像。从the basics 开始,使用 bash 脚本中的以下内容:
TOKEN=$(curl -s -H "Content-Type: application/json" -X POST -d '{"username": "'${UNAME}'", "password": "'${UPASS}'"}' https://hub.docker.com/v2/users/login/ | jq -r .token)
我在 PHP 中创建了一些 cURL,试图为 Docker Hub 获取令牌:
$user = 'xxxxxxxx';
$pass = 'xxxxxxxx';
$namespace = 'xxxxxxxx';
$headers = array();
$headers[] = 'Content-Type: application/json';
$url = "https://hub.docker.com/v2/users/login/";
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, $url);
curl_setopt($ch, CURLOPT_HTTPHEADER, $headers);
curl_setopt($ch, CURLOPT_POST, 1);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_USERPWD, "$user:$pass");
curl_setopt($ch, CURLOPT_HTTPAUTH, CURLAUTH_BASIC);
$return = curl_exec($ch);
curl_close ($ch);
var_dump($return);
回应:
布尔(假)
如果我直接在浏览器的地址栏中输入 URL https://regsitry.hub.docker.com/v2/users/login/,我会得到:
{"username": ["This field is required."], "password": ["This field is required."]}
如果我从 cURL 请求中删除用户名和密码,我仍然会收到 bool(false) 响应。使用 PHP 与 Docker Hub/Registry API 交互的情况很少(实际上我几乎没有发现)。我的错误日志中没有错误。
我是否遗漏了一些明显的东西?还是没有办法通过 PHP 与 Docker API 交互?
【问题讨论】:
-
嗨,我猜 set -e 是一个管道,如果命令或管道有错误,它会停止脚本的执行,但是 PHP 中的 curl 并不能保证管道,因为报告了很多关于此的错误CURL 上的选项,但看看是否可以添加此 CURLMOPT_PIPELINING 不确定结果。
-
为什么将 JSON 身份验证负载转换为 HTTP 身份验证?
-
set -e用于环境变量@headmax -
@Sammitch 发布了答案,您正在尝试的是具有基本身份验证的网站,而不是 JSON 有效负载。
-
@Jay Blanchard 是的,并且 set -e 用于在 shell 管道上发送凭据,您可以设置 -o pipefail 来传播错误。 stackoverflow.com/questions/19622198/….
标签: php curl docker docker-registry