PHP调用docker exec执行容器内R脚本返回空响应问题排查
问题描述
在R-base Docker容器中执行R脚本并通过PHP解析输出时,出现控制台执行正常、PHP调用返回空响应的问题:
正常场景验证
待执行的docker命令如下:
docker exec -w /var/www/vhosts/httpdocs/webroot/code -it R_3.5.3 Rscript my_script.R /var/www/vhosts/httpdocs/webroot/media/transfer/tmp/filetoparse.txt
- 直接在服务器控制台执行上述命令,可正常返回JSON格式结果:
[{"id":"C1","type":"CONSTANT","value":"C1",....]
- 控制台将命令输出赋值给变量后打印,结果正常:
myvar=`docker exec -w /var/www/vhosts/httpdocs/webroot/code -it R_3.5.3 Rscript my_script.R /var/www/vhosts/httpdocs/webroot/media/transfer/tmp/filetoparse.txt` echo $myvar >>[{"id":"C1","type":"CONSTANT","value":"C1",....]
- 已将apache用户加入Docker用户组,切换到apache用户身份在控制台执行上述脚本可正常运行。
异常场景
通过Apache承载的PHP服务调用上述命令时无任何返回,测试代码如下:
exec("docker exec -w /var/www/vhosts/httpdocs/webroot/code -it R_3.5.3 Rscript my_script.R /var/www/vhosts/httpdocs/webroot/media/transfer/tmp/filetoparse.txt", $outputs); debug($outputs);
调试输出为空:
APP/Controller/MyController.php (line 56) ''
尝试将命令输出重定向写入日志文件也未获取到内容,初步判断R脚本未被正常执行。
问题根因及排查方案
核心诱因:错误使用-it参数
90%以上同类问题都是命令中携带的-it参数导致:-it是两个docker exec参数的组合:
-i:保持标准输入流打开-t:为执行进程分配伪交互终端(TTY)
PHP作为Apache子进程运行时,本身没有绑定任何交互终端,此时加-t参数会直接导致docker exec执行失败,且不会输出任何有效内容。非交互场景下调用docker exec不需要加-t参数,无输入传递需求时连-i都可以省略,直接删除命令中的-it即可解决大部分问题。
修正后的命令:
docker exec -w /var/www/vhosts/httpdocs/webroot/code R_3.5.3 Rscript my_script.R /var/www/vhosts/httpdocs/webroot/media/transfer/tmp/filetoparse.txt
后续排查步骤
如果删除-it后仍未正常返回,按以下步骤定位:
- 捕获命令返回码和错误输出
调用exec时传入返回值变量,同时将标准错误重定向到标准输出,避免错误信息丢失,测试代码:// 末尾的2>&1作用是把错误输出合并到标准输出 $cmd = "docker exec -w /var/www/vhosts/httpdocs/webroot/code R_3.5.3 Rscript my_script.R /var/www/vhosts/httpdocs/webroot/media/transfer/tmp/filetoparse.txt 2>&1"; exec($cmd, $outputs, $return_code); // return_code为0代表执行成功,非0则为错误码,$outputs中会包含具体错误信息 var_dump($return_code, $outputs); - 检查系统安全策略限制
如果返回码显示权限不足,检查服务器是否开启SELinux/AppArmor,默认安全策略会禁止httpd进程调用docker等外部命令。可临时执行setenforce 0关闭SELinux测试,如果恢复正常则配置对应放行规则即可,不要长期关闭安全模块。 - 路径统一使用绝对路径
PHP web进程的工作目录和控制台登录后的工作目录不一致,命令中涉及的脚本路径、输入文件路径全部替换为绝对路径,避免因相对路径找不到文件导致执行失败。
内容的提问来源于stack exchange,提问作者ƒernando Valle
相关产品推荐
相关产品推荐

