2017-12-27 219 views
2

我试图从PHP脚本登录并推送Docker图像作为我们的CICD过程的一部分。下面是代码:从PHP脚本登录到Docker Hub

<?php 

include '../php/database.php'; 

$duser = 'username'; 
$dpass = 'password'; 
$dmail = 'email'; 

$tag = 'from system'; 

function tagImage($tag) { 
    $getImageID = "SELECT `imageID` FROM `docker_images` WHERE `tag` = :tag "; 
    $params = array(':tag' => $tag); 
    $results = dataQuery($getImageID, $params); 
    if(!empty($results)) { 
     $image = $results[0]['imageID']; 
     global $repo = $results[0]['repo']; // I know this is a bad idea, will change it when all else is working 
     $last = system("sudo docker tag -f $image $repo 2>&1", $retval); 
    } 
    return $retval; 
} 

$tagStatus = tagImage($tag); 

if(0 == $tagStatus) { 
    echo '<pre>'; 

    $login = system("sudo docker login --username=$duser", $retval); 
    var_dump($login); 
    var_dump($retval); 
    // push it real good 
    $last = system("sudo docker push $repo 2>&1", $retval1); 
    var_dump($last); 
    var_dump($retval1); 
} 
?> 

这将返回以下:

string(0) "" 
int(1) 
The push refers to a repository [app/ap-name] (len: 1) 
21d623eb89a9: Image push failed 

Please login prior to push: 
Username: EOF 
string(13) "Username: EOF" 
int(1) 

,推失败,因为登录不从PHP脚本工作,但是当我在命令行登录登录是成功的。

我在做什么错?我可以使用PHP登录Docker Hub吗?或者这种技术应该不同?

编辑: PHP脚本将通过AJAX调用,有效地使它运行,就像它从浏览器运行一样。我正在从浏览器运行它来进行测试。

+0

尝试'echo“密码”| sudo docker登录名--username $ duser --password-stdin',可能工作.. –

+0

查看文档https://docs.docker.com/engine/reference/commandline/login/#login-to-a-self -hosted-registry the提供使用STDIN部分的密码 –

+0

不要忘了摆脱'全球'; p你应该知道更好的... –

回答

1

登录要求所有与码头工人枢纽回购相关的凭据,包括密码和电子邮件地址:

$login = system("sudo docker login --username $duser --password $dpass --email $dmail 2>&1", $retval); 
var_dump($login); 
var_dump($retval); 

使用此语法返回以下(预计):

WARNING: login credentials saved in /root/.dockercfg. 
Login Succeeded 
string(15) "Login Succeeded" 
int(0) 

过去的那点push正常工作并且不返回错误。