2017-06-13 53 views
1

那麼,我需要使用PHP函數運行Docker。我有一個推送鏈接的網頁,我使用shell_execexec執行shell命令。如果執行結果如ls或預期結果一樣,這對我很有用。問題是,如果命令要運行Docker(或例如ping),它不起作用。使用PHP在shell中運行docker

我想要的是,當用戶單擊鏈接時,shell將執行一個命令在瀏覽器中運行Docker,並將頁面重定向到那裏。

例如,如果我使用shell_exec('firefox');這應該打開一個新的Firefox瀏覽器,但它不起作用。似乎瀏覽器已打開,但幾秒鐘後關閉。

這是Docker執行不起作用。

public function executeDocker() { 
     $result = shell_exec('docker run --rm -p 3838:3838 shiny/gsva_interactive /usr/bin/shiny-server.sh'); 

     echo "<br><br>Execution: ".$result; 
    } 
+0

爲什麼不在末尾添加一些東西,比如''docker run --rm -p 3838:3838 shiny/gsva_interactive /usr/bin/shiny-server.sh; tail/var/log/xxx'? – user2915097

+0

該命令的功能非常強大,是不起作用的PHP功能。 – JFernandez

回答

0

最後我解決了它。問題出在用戶組和權限上。在我使用的系統中,CentOS,apache服務器使用一個叫做apache的用戶。該用戶需要位於docker組中並重新啓動服務。

現在,它的工作。感謝所有幫助過我的人。

1

shell_exec將只返回的輸出,在這種情況下多克爾,僅當命令已經完全退出命令。在ping的情況下(它會繼續ping),並且可能在你的Docker鏡像的情況下,這個進程永遠不會退出,所以它永遠不會迴應。

使用passthru而不是shell_exec應該爲您提供Docker腳本的命令行輸出,作爲響應。

如果多克爾容器並不意味着退出,你或許應該$containerId = shell_exec('docker run -d --rm -p 3838:3838 shiny/gsva_interactive /usr/bin/shiny-server.sh')啓動它在detached mode,所以搬運工運行命令將退出。這將返回容器ID,您可以使用它與$result = shell_exec("docker ps -f \"id=$containerId\"")一起檢查容器是否正確運行,如果是,則重定向用戶。

+0

我不想輸出,我只需要知道Docker正在正確執行並找到一種方法來控制執行。 – JFernandez

+0

你能確認Docker容器退出嗎?因爲我的答案是,如果Docker容器永遠不會退出,shell_exec永遠不會給你任何*輸出。 Ping也將永遠不會以默認設置退出,所以這就是爲什麼'ls'工作而'ping'不能。 – eawenden

+0

我更新了我的問題,假設您不希望Docker容器退出。 – eawenden