【问题标题】:How do I allow www-data to change folder permissions when using Docker and pdftohtmlEX to make the folder?使用 Docker 和 pdftohtmlEX 创建文件夹时,如何允许 www-data 更改文件夹权限?
【发布时间】:2021-10-21 20:22:00
【问题描述】:

编辑:我发现了问题 我使用的是用户/组 1000:1000,但在将正确的用户添加到正确的组后,它需要是 1:1。多么n00b。希望其他人能找到这个,它可以节省他们在解决错误问题时失去的时间lol

出于开发目的,我在 Lightsail 实例上运行了 Docker(因此我可以使用 pdf2htmlEX)。使用这个一切正常:

exec('docker run --rm -v ' . $fileLoc . ':/pdf -u 1000:1000 bwits/pdf2htmlex pdf2htmlEX --embed cfijo --split-pages 1 --zoom 1 --dest-dir presentations/' . $presName . ' --page-filename content-%d.page temp_pdf/' . $filename . ' 2>&1', $output, $retVal);

注意:我必须告诉 Docker 是用户 1000:1000,以便它可以创建文件夹和文件。

问题是,文件夹$presName 最终的 chmod 为 700,它必须是 755,而所有文件都很棒,有一个可爱的 644。我这辈子都无法获得这些更新权限。 .

我已经尝试了所有我能想到/在互联网上找到的命令:

exec('docker run --rm -u 1000:1000 chmod 755 ' . $fileLoc . '/presentations/' . $presName);
exec('sudo chmod 755 ' . $fileLoc . '/presentations/' . $presName);
exec('echo my-password-was-here | /usr/bin/sudo -S chmod 755 ' . $fileLoc . '/presentations/' . $presName);
exec("bash -lc 'echo my-password-was-here | /usr/bin/sudo -S chmod 755 ' . $fileLoc . '/presentations/' . $presName'");

这些都不做任何事情。

“没问题!”我想,大声地,我将使用 PHP 来创建具有正确权限的文件夹,因此它已经存在......但是很遗憾,PHP 甚至不能使用 mkdir

我对此没有深入了解,因为我从未使用过 Docker,而且,尽我所能,某种容器,某种用户。 ¯\(ツ)

我已经花了好几天的时间来反对这个。我只是(大声笑“只是”)希望文件夹是 755!这就是我所需要的......

有简单的解决方案吗?有什么我可以在终端输入的吗?我可以修改 Docker 配置来解决这个问题吗?或者这会非常复杂,我必须消化所有 Docker 文档并成为专家?

[编辑:我用这个 https://hub.docker.com/r/bwits/pdf2htmlex/]

【问题讨论】:

    标签: docker permissions chmod amazon-lightsail


    【解决方案1】:

    我相信您在为容器构建映像时,需要在映像过程结束时将文件放入 WORK DIR 的命令中。如果您通过 Docker 查看此文档,他们建议使用 WORK DIR 命令以便能够以正确的用户权限运行。

    文档链接:https://docs.docker.com/engine/reference/builder/#workdir

    引用 Docker:“WORKDIR 指令为 Dockerfile 中任何 RUN、CMD、ENTRYPOINT、COPY 和 ADD 指令设置工作目录。如果 WORKDIR 不存在,即使不存在也会创建它用于任何后续的 Dockerfile 指令。”

    命令:WORKDIR /warmup

    我使用此命令在容器中运行 .NET,只需确保在执行 WORKDIR 命令后以CMDENTRYPOINT 结束,以便 Docker 知道从哪里运行以及传递给它的内容.

    另外,我知道您正在建立 Light sale,但有一本很棒的书“Elton Stoneman 在 Windows 上调用 Docker”,这是我了解 Docker 最多的地方。这本书我怎么推荐都不够。

    【讨论】:

    • 感谢您的回复!这是我使用的 Docker 文件,它的 WORK DIR 设置为 /pdf: github.com/BWITS/pdf2htmlEX_docker/blob/master/Dockerfile 但我目前正在输出到 presentations/' . $presName . ' 这是我的问题的根源吗? $presName 永远不会相同,但将 presentations 更改为 pdf 会使这个问题消失吗?
    • 我会将 /pdf 更改为 /presentations。我不明白你为什么先放卷然后放工作目录。就像你做工作目录​​一样。 Docker 将创建一个包含您指定的工作目录的子容器。还可以使用您放置的 CMD 命令。不明白,你想在运行的时候传递给docker容器什么?
    • 我什么都不懂,因为它不是我的 docker 文件¯_(ツ)_/¯ 我猜想,因为这个人将其公开用于专门做我想做的事情做,至少大部分是正确的。我实际上只是按照他们说的去做:github.com/coolwanglu/pdf2htmlEX/wiki/Download
    • 据我所知,如果您将 pdf 更改为演示文稿,那么只要您使用以下命令,它就应该可以工作: alias pdf2htmlEX="docker run -ti --rm -v ~/ presentation:/presentation bwits/pdf2htmlex-alpine pdf2htmlEX" 然后是下面两条命令: pdf2htmlEX -h pdf2htmlEX --zoom 1.3 yourpdf.pdf
    • 感谢您的帮助,杰森,不幸的是,这并没有解决我的问题。我设置了一个全新的 Lightsail 来测试它(并让它像以前一样“工作”)。在运行您的命令时,仍然会将 PDF 转换为 HTML,它会输出到与源 PDF 相同的文件夹。如果我尝试输出到一个新文件夹,我最终会得到一个 chmod 700 的文件夹。它似乎总是创建 644 的文件和 700 的文件夹。