2017-12-27 419 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正常工作並且不返回錯誤。