【问题标题】:Docker PHP exec() function: permission deniedDocker PHP exec() 函数:权限被拒绝
【发布时间】:2021-04-15 15:04:00
【问题描述】:

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

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

例如,当我跑步时

echo exec('docker --version');

我在浏览器的 PHP 脚本中获得了这些信息:

sh: 1: docker: Permission denied

无论我运行 exec() 函数还是 shell_exec() 或 system() 之类的任何替代函数都没有关系。在过去的几天里,我一直在尝试一切,但没有成功。这一定是 docker 的东西,但我不知道它是什么。

我尝试过的一些事情:

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

【问题讨论】:

  • 你只需要 docker 还是 docker 可以访问其他正在运行的容器?

标签: php docker permissions exec permission-denied


【解决方案1】:

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

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

RUN chmod go+x `which docker`

应允许任何用户在容器内运行 docker 命令,但可能会被视为存在安全风险。


请注意,在上面的命令中,我认为您会直接复制并粘贴该命令。 which 命令将定位 docker 可执行文件,而包含 which dockerbackticks 将使用 chmod 命令中的输出,因此无需知道 docker 可执行文件的确切位置。

【讨论】:

  • 感谢 Paul 的即时答复。我应该写什么来代替“which docker”?我试过RUN chmod go+x /var/www/html,但它不起作用。我重建了 PHP 容器,错误仍然存​​在。
  • 实际上,我的意思是用反引号括起来的字面意思是“哪个 docker”。 which 是在路径上定位文件的系统命令。反引号告诉 shell 执行命令并替换响应,因此您不需要事先知道 docker 可执行文件的路径。
  • 我是这么认为的,实际上我首先尝试了“which docker”,但是在重建容器时出现红色错误。这是错误:chmod: missing operand after 'go+x' Try 'chmod --help' for more information.。我尝试了一个带有直引号 (') 的版本,然后我收到了这个错误:chmod: cannot access 'which docker': No such file or directory
  • 有趣。我不是一个 docker 人——你可能需要自己找到 docker 可执行文件并将文字值放在那里。或者,容器中可能不存在 docker 可执行文件。
  • 当我在控制台中插入“which docker”时,我得到/usr/bin/docker。所以我尝试了RUN chmod go+x /usr/bin/docker,但后来我收到了这个错误:chmod: cannot access '/usr/bin/docker': No such file or directory。我会继续努力的。谢谢你的帮助。当我让它工作时,我会在这里发布更新。
猜你喜欢
  • 2022-08-08
  • 2023-01-26
  • 1970-01-01
  • 2022-06-17
  • 2012-05-01
  • 2022-01-18
  • 2015-05-11
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多