Reputation: 34426
In order to facilitate a remote CICD process for our applications I am trying to access our Docker Hub/Registry to be able to list, tag and push images. Starting with the basics using the following from a bash script:
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)
I created some cURL in PHP, trying to get a token for 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);
The response:
bool(false)
If I enter the URL https://regsitry.hub.docker.com/v2/users/login/ directly into the address bar of the browser I get:
{"username": ["This field is required."], "password": ["This field is required."]}
If I eliminate the username and password from the cURL request I still get the bool(false)
response. There is very little (actually I found next to nothing) for using PHP to interact with the Docker Hub/Registry API(s). There are no errors in my error logs.
Am I missing something obvious? Or is there no way to interact with the Docker API via PHP?
Upvotes: 0
Views: 272
Reputation: 32272
This:
curl_setopt($ch, CURLOPT_USERPWD, "$user:$pass");
is not equivalent to:
-d '{"username": "'${UNAME}'", "password": "'${UPASS}'"}'
but this is:
curl_setopt($ch, CURLOPT_POSTFIELDS, json_encode(['username'=>$user, 'password'=>$pass]));
and it works.
Upvotes: 2