2017-06-13 107 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