我有一个程序位于 Docker 容器中。我希望能够转到浏览器页面并运行 Docker 容器,以便程序启动。
因此,我创建了一个运行 Docker 命令的 bash 脚本(运行容器.sh):
#!/bin/sh
sudo docker run -ti --rm -e DISPLAY=$DISPLAY -v /tmp/.X11-unix:/tmp/.X11-unix myproject
然后我创建了一个运行该 shell 脚本的 PHP 文件(网页脚本.php):
<?php
exec('/usr/lib/cgi-bin/runcontainer.sh');
?>
我正在运行安装了 apache2 的 ubuntu 16.04 。
问题:php webscript.php
如果我在 bash 终端中 运行,该程序就会运行。容器启动,程序启动。但是,如果我尝试从网络浏览器(firefox)中尝试,则不会。
我去http://localhost/cgi-bin/webscript.php,我看到了该页面,但 Docker 容器从未启动。所以,我查看了 /var/log/apache2/error.log,并看到了这个错误:sudo: no tty present and no askpass program specified
。
基于类似的问题,我跑去 sudo apachectl -S
看apache用户和组的名称。两者都是 www-data。因此,我将/usr/lib/cgi-bin/目录下的用户和组设置为www-data。
即使 www-data 具有完全权限,我仍然看到该sudo: no tty present and no askpass program specified
错误。我发现的其他答案说更改 sudoers 文件以授予 www-data ALL 访问权限。但我不想这样做,因为这似乎不安全。
答案1
我进行了一些实验(使用 Cron 代替 Apache 并/bin/ls
代替runcontainer.sh
)来重现您遇到的错误消息。基于此,我建议您首先验证是否www-data
可以在没有密码的情况下运行您想要的命令。
要检查是否可以在没有密码的情况下运行命令,请以 root 用户身份登录,然后
# su - -s /bin/bash www-data
$ sudo /usr/lib/cgi-bin/runcontainer.sh
另外,您还应该检查/etc/sudoers
您是否已/usr/lib/cgi-bin/runcontainer.sh
为www-data
用户启用。
%www-data ALL=(ALL) NOPASSWD: /usr/lib/cgi-bin/runcontainer.sh
如果上述工作有效,我们就可以专注于下一个级别。