使用Docker运行pdf2htmlEX时如何让www-data修改生成的文件夹权限
回答
你找到的用户/用户组配置问题是核心原因,这类Docker挂载卷的权限问题本质是宿主机和容器内用户的UID/GID不匹配导致的。除了你已经验证可行的调整为1:1用户运行、将宿主机执行用户加入对应用户组的方案外,还有3种通用的备选方案可以按需选择:
- 方案1:合并执行转换和权限修改命令
直接用root用户启动容器,在同一次容器运行中先执行pdf转换,再修改目标目录权限,不需要额外调用chmod命令,也避免了宿主机的sudo权限校验问题,代码示例如下:
exec('docker run --rm -v ' . $fileLoc . ':/pdf -u 0:0 bwits/pdf2htmlex sh -c "pdf2htmlEX --embed cfijo --split-pages 1 --zoom 1 --dest-dir presentations/' . $presName . ' --page-filename content-%d.page temp_pdf/' . $filename . ' && chmod -R 755 /pdf/presentations/' . $presName . '" 2>&1', $output, $retVal);
- 方案2:提前在宿主机创建目标目录
执行Docker转换命令前,先用root用户在宿主机创建好对应目录,设置好权限和所有者,就不会出现容器创建目录权限不对的问题,终端执行命令示例:
mkdir -p 【替换为你的$fileLoc实际路径】/presentations/$presName chmod 755 【替换为你的$fileLoc实际路径】/presentations/$presName chown 1000:1000 【替换为你的$fileLoc实际路径】/presentations/$presName
- 方案3:自定义镜像修改默认umask
如果需要频繁使用这个转换功能,可以基于官方镜像做一层简单的自定义封装,在Dockerfile中添加umask配置,让容器内新建的目录默认权限就是755,不需要后续修改权限,Dockerfile示例:
FROM bwits/pdf2htmlex RUN echo "umask 022" >> /etc/profile CMD ["/bin/sh", "-l"]
另外你之前单独执行chmod命令不生效的原因是:你启动chmod容器时只把宿主机的$fileLoc挂载到了容器的/pdf目录,执行chmod时用的是宿主机的$fileLoc路径,容器内不存在这个路径,命令自然不会生效。
内容的提问来源于stack exchange,提问作者TKMIN
相关产品推荐
相关产品推荐

