在 Dockerfile 中指定 umask

cod*_*iga 4 php apache docker

我正在使用 Mac OS,最近我正在尝试使用 docker 设置开发环境。Docker 看起来不错,但目前我面临以下问题:

问题:

每当 PHP(在 docker 容器中)创建带有子文件夹的文件夹时,apache 都会导致 500 错误。Apache 日志:“...无法创建目录 app/../../folder/subfolder/subsubfolder/”

我假设这是由环境变量umask引起的,因为无论何时创建文件夹,它都没有写权限。因为无法创建子文件夹等等。

为了测试这一点,我写了一个小测试脚本(umask-test.php):

$umask = umask(0);
echo ("umask = $umask <br>");
Run Code Online (Sandbox Code Playgroud)

还有宾果游戏!每次我构建并运行容器并通过浏览器启动脚本时,结果是:

umask = 18
Run Code Online (Sandbox Code Playgroud)

目标:

所以我想让umask始终设置为000(零)

我发现,设置此变量的最佳位置是 Dockerfile,因此在 Dockerfile 中我声明了以下内容:

FROM ubuntu:trusty
...
ENV UMASK 0
...
Run Code Online (Sandbox Code Playgroud)

问题是,这没有任何结果:

  • 测试脚本为 umask 给出 18
  • 仍然使用错误的权限创建文件夹
  • 无法创建子文件夹。

问题:

我究竟做错了什么?

docker 容器中的 umask 如何始终设置为零?

如何允许 apache-user (www-data) 创建始终具有写入权限的文件夹以及可以在其中创建子文件夹的文件夹?

cod*_*iga 5

问题解决了

由于希望这对其他人有帮助,我想为我自己的问题提供答案:

问题不在于容器中的 docker 和 umask-settings。问题是 Mac 和Mac OS 上的 umask 设置!!

示例:如果 Mac 上的 umask 设置为 022,则 docker 在挂载目录上创建的文件夹的权限为 755。这会导致无法创建子文件夹。

此链接提供有关如何为 Mac 设置 umask 的信息:https : //support.apple.com/en-us/HT201684

所以如果你在终端中输入

 sudo launchctl config user umask 000
Run Code Online (Sandbox Code Playgroud)

并重新启动,您的所有文件夹都将使用 777 权限创建。包括挂载到 docker 的文件夹。

在我问自己为什么运行容器(用 run -v ... 初始化)没有真正工作之前。现在它似乎工作正常!:-)


Ian*_*bbs 0

根据 Docker 文档,您使用 ENV 设置的环境变量确实会保留到正在运行的容器中,但出于安全原因,Apache 可能非常挑剔在启动时关注哪些变量。

试试这个答案