Docker PHP exec()函数:权限被拒绝

Docker PHP exec()函数:权限被拒绝,php,docker,permissions,exec,permission-denied,Php,Docker,Permissions,Exec,Permission Denied,我试图在PHP中运行exec()函数,但得到了“权限被拒绝”的输出。PHP作为Docker容器安装。我在Raspberry PI和我的Macbook上都有这个 为了测试,我在没有Docker的情况下安装了LAMP,它工作正常,但在Docker上没有 例如,当我跑步的时候 echo exec('docker --version'); 我在浏览器中的PHP脚本中获得以下信息: sh: 1: docker: Permission denied 不管我是运行exec()函数,还是任何类似shell_

我试图在PHP中运行exec()函数,但得到了“权限被拒绝”的输出。PHP作为Docker容器安装。我在Raspberry PI和我的Macbook上都有这个

为了测试,我在没有Docker的情况下安装了LAMP,它工作正常,但在Docker上没有

例如,当我跑步的时候

echo exec('docker --version');
我在浏览器中的PHP脚本中获得以下信息:

sh: 1: docker: Permission denied
不管我是运行exec()函数,还是任何类似shell_exec()或system()的替代方法。在过去的几天里,我一直在尝试一切,但都没有成功。这一定是码头工人的事,但我不知道是什么

我尝试过的一些事情:

  • 更改了my.PHP文件及其所在目录的所有权
  • 将权限更改为777
  • 将www数据用户添加到sudoers文件
  • 将www数据添加到docker组

您收到的错误表明exec正在工作,但运行该命令的用户无权访问docker二进制文件

您必须修改docker容器内的权限,以允许web用户运行docker命令。您需要将这些步骤添加到
Dockerfile

RUN chmod go+x `which docker`
应允许任何用户在容器内运行docker命令,但可能会被视为存在安全风险



注意,在上面的命令中,我想您应该直接复制并粘贴该命令。该命令将定位docker可执行文件,并将
哪个docker
使用
chmod
命令中的输出括起来,这样就不必知道docker可执行文件的确切位置。

您收到的错误指示该执行文件正在工作,但是运行该命令的用户没有访问docker二进制文件的权限

您必须修改docker容器内的权限,以允许web用户运行docker命令。您需要将这些步骤添加到
Dockerfile

RUN chmod go+x `which docker`
应允许任何用户在容器内运行docker命令,但可能会被视为存在安全风险



注意,在上面的命令中,我想您应该直接复制并粘贴该命令。该命令将定位docker可执行文件,并且包含
哪个docker
将使用
chmod
命令中的输出,因此无需知道docker可执行文件的确切位置。

感谢Paul的即时回答。我该写什么来代替“哪个码头工人”?我试着运行chmodgo+x/var/www/html,但它不起作用。我重新构建了PHP容器,错误依然存在。实际上,我的意思是“哪个docker”包含在backticks中。是在路径上定位文件的系统命令。backticks告诉shell执行命令并替换响应,因此您不需要事先知道docker可执行文件的路径。我想是这样的,实际上我先尝试了“哪个docker”,但在重建容器时出现了红色错误。以下是错误:
chmod:go+x之后缺少操作数。有关详细信息,请尝试“chmod--help”。
。我尝试了一个带有直接引号(')的版本,但出现了以下错误:
chmod:无法访问“哪个docker”:没有这样的文件或目录。我不太喜欢docker——您可能需要自己定位docker可执行文件并将文本值放在其中。或者,可能容器中不存在docker可执行文件。当我在控制台中插入“which docker”时,我得到
/usr/bin/docker
。所以我试着运行chmod go+x/usr/bin/docker
,但是我得到了这个错误:
chmod:cannotaccess'/usr/bin/docker':没有这样的文件或目录
。我会继续努力的。谢谢你的帮助。我会在这里发布一个更新,当我让它工作。感谢保罗的即时回答。我该写什么来代替“哪个码头工人”?我试着运行chmodgo+x/var/www/html,但它不起作用。我重新构建了PHP容器,错误依然存在。实际上,我的意思是“哪个docker”包含在backticks中。是在路径上定位文件的系统命令。backticks告诉shell执行命令并替换响应,因此您不需要事先知道docker可执行文件的路径。我想是这样的,实际上我先尝试了“哪个docker”,但在重建容器时出现了红色错误。以下是错误:
chmod:go+x之后缺少操作数。有关详细信息,请尝试“chmod--help”。
。我尝试了一个带有直接引号(')的版本,但出现了以下错误:
chmod:无法访问“哪个docker”:没有这样的文件或目录。我不太喜欢docker——您可能需要自己定位docker可执行文件并将文本值放在其中。或者,可能容器中不存在docker可执行文件。当我在控制台中插入“which docker”时,我得到
/usr/bin/docker
。所以我试着运行chmod go+x/usr/bin/docker
,但是我得到了这个错误:
chmod:cannotaccess'/usr/bin/docker':没有这样的文件或目录
。我会继续努力的。谢谢你的帮助。我会在这里发布一个更新,当我让它工作时。你只需要docker或docker访问其他正在运行的容器吗?你只需要docker或docker访问其他正在运行的容器吗?