【问题标题】:How to fix file permissions on wp-content with official wordpress image for docker-compose如何使用 docker-compose 的官方 wordpress 图像修复 wp-content 的文件权限
【发布时间】:2019-04-18 13:27:18
【问题描述】:

问题


我正在使用 docker-compose 和 docker 存储库中的官方 wordpress 图像设置一个 Wordpress 本地环境。

我在窗户上。

问题是我在 wp-content 上有一些权限问题,我无法从我的 Wordpress 管理面板上传文件。

我已经做了什么


然后我检查了容器内的文件权限,这是输出:



如您所见,我的wp-content 的所有者是root 而不是www-data

立竿见影的解决办法是打开容器的bash并给
chown -R www-data:www-data /var/www/html/wp-content/

这当然可行,但我不想每次开始一个新的 wordpress 项目时都执行此过程。为了实现这一点,我创建了一个Dockerfile,如下所示:

FROM wordpress:5.1.1

# install dos2unix (fix problem between CRLF and LF)
RUN apt-get update
RUN apt-get install -y dos2unix

# increase upload limit
RUN touch /usr/local/etc/php/conf.d/uploads.ini \
    && echo "upload_max_filesize = 10M;" >> /usr/local/etc/php/conf.d/uploads.ini

# fix permissions issues
COPY entrypoint.sh /
RUN dos2unix /entrypoint.sh
RUN chmod +x /entrypoint.sh
ENTRYPOINT ["/entrypoint.sh"]

而我的entrypoint.sh 看起来像这样:

#!/bin/bash
echo Fixing permissions...
chown -R www-data:www-data /var/www/html/wp-content/

但后来我意识到我正在覆盖原始 wordpress 图像的ENTRYPOINT,并且容器总是以code 0 退出。

然后我尝试使用CMD 而不是ENTRYPOINT,并像这样更改了我的Dockerfile

FROM wordpress:5.1.1

# increase upload limit
RUN touch /usr/local/etc/php/conf.d/uploads.ini \
    && echo "upload_max_filesize = 10M;" >> /usr/local/etc/php/conf.d/uploads.ini

CMD chown -R www-data:www-data /var/www/html/wpcontent/

但我总是收到文件或文件夹不存在的错误。

我也试过像这样使用CMD
CMD ["chown", "-R", "www-data:www-data", "/var/www/html/wp-content/"]
但没有成功。

问题


有一种方法可以在 原始 ENTRYPOINT 之后运行命令?
你知道解决这个问题的更好方法吗?

【问题讨论】:

  • 如何创建容器?

标签: wordpress docker docker-compose


【解决方案1】:

您可以修改您的./entrypoint.sh 脚本,使其在执行您的 chown 命令后运行原始图像的默认入口点脚本:

#!/bin/bash
echo Fixing permissions...
chown -R www-data:www-data /var/www/html/wp-content/
docker-entrypoint.sh apache2-foreground

【讨论】:

  • 这是最佳实践吗?如果默认入口点脚本在未来某个时间点发生变化怎么办?现在遇到这个问题,不确定我是否应该使用 DockerFile“扩展”wordpress 图像或按照您的回答建议。
  • @Patrick Steadman 从技术上讲,它不是需要由 root 拥有的整个文件夹吗?
  • @FooBar 我认为这取决于个人的用例,设置 www-data 拥有的wp-content 应该足以允许通过 wp-admin 上传媒体/插件/主题文件,但是当从 docker 主机编辑绑定挂载中的文件时,它会为权限问题创建一个新问题,这可以通过将主机中的当前用户添加到 www-data 组(或系统上具有 gid 33 的任何组)来解决。所有这一切都感觉很hacky,希望有更好的解决方案...我尝试更改wordpress在容器中运行的用户ID,但没有成功。
【解决方案2】:

从 Docker 的文档中,您应该使用的命令是 RUN

不要将 RUN 与 CMD 混淆。 RUN 实际运行一个命令并提交结果; CMD 在构建时不执行任何操作,而是为映像指定预期的命令。

所以 Dockerfile 中的行应该是: RUN chown -R www-data:www-data /var/www/html/wp-content

另外,为了减少创建的层数和图像的大小,我会尽可能多地链接RUN 命令。例如(未测试):

FROM wordpress:5.1.1

# install dos2unix (fix problem between CRLF and LF) and increase upload limit
RUN apt-get update -y && \
    apt-get install -y dos2unix && \
    touch /usr/local/etc/php/conf.d/uploads.ini \
    && echo "upload_max_filesize = 10M;" >> /usr/local/etc/php/conf.d/uploads.ini && \
    chown -R www-data:www-data /var/www/html/wp-content

# fix permissions issues
COPY entrypoint.sh /
RUN dos2unix /entrypoint.sh && \
    chmod +x /entrypoint.sh

ENTRYPOINT ["/entrypoint.sh"]

【讨论】:

  • 我有点困惑:你的运行命令已经改变了 wp-content 的所有者。我需要所有与 entrypoint.sh 相关的东西吗?
  • 很遗憾,这行不通。构建完成后,任何更改都将被覆盖。来源:docs.docker.com/engine/reference/builder/…
【解决方案3】:

这是由于 WordPress Docker 镜像的创建方式造成的。

我创建了一个Pull Request 以使wp-content 文件夹在使用卷共享时属于www-data

在合并之前(如果是的话),您可以创建自己的 WordPress Docker 映像来集成我的更改。取https://github.com/docker-library/wordpress 上的文件夹之一(选择PHP 版本,然后选择webserver 参数)。

  1. 在您的项目中创建一个docker/wordpress 文件夹。
  2. 将两个原始文件(Dockerfiledocker-entrypoint.sh)从 GitHub 复制到该文件夹​​中。
  3. docker-entrypoint.sh 中替换这些行:
        if [ "$(id -u)" = '0' ] && [ "$(stat -c '%u:%g' .)" = '0:0' ]; then
            chown "$user:$group" .
        fi

作者:

        if [ "$(id -u)" = '0' ]; then
            chown -R "$user:$group" .
        fi

【讨论】:

【解决方案4】:

问题

docker-entrypoint.sh 在您的Dockerfileentrypoint.sh 之后运行,覆盖您设置的权限。

解决方案

自定义入口点执行延迟命令,在 docker-entrypoint.sh 运行后设置所有权。

您的 Dockerfile

FROM wordpress:php7.4-apache

[...]

ENTRYPOINT ["/entrypoint.sh"]

您的 entrypoint.sh


# In 10 seconds set the ownership

$(sleep 10 && chown -R www-data:www-data /var/www/html/) & 

# Run the parent's ENTRYPOINT and CMD as defined in its Dockerfile
#     (https://github.com/gsusI/wordpress/blob/master/php7.4/apache/Dockerfile)

docker-entrypoint.sh apache2-foreground # run parent entrypoint.

注意:手动调用父级的 ENTRYPOINT 和 CMD 意味着如果父级 Dockerfile 更改其最后两行,此解决方案可能无法正常工作。

因此建议在更新FROM 时,检查父级的 Dockerfile 以验证最后两行是否仍然存在:

ENTRYPOINT ["docker-entrypoint.sh"]

CMD ["apache2-foreground"]

【讨论】:

    猜你喜欢
    • 2016-12-25
    • 2022-06-29
    • 2019-08-28
    • 1970-01-01
    • 1970-01-01
    • 2021-10-28
    • 1970-01-01
    • 1970-01-01
    • 2020-03-18
    相关资源
    最近更新 更多