权限问题:如何在 docker for windows 上设置权限以与 Wordpress 一起使用

Sam*_*ser 8 php wordpress dockerfile docker-for-windows

问题

我正在尝试使用 Docker for Windows 设置我的开发环境以与 Wordpress 一起使用。我正在使用带有自定义 Dockerfile 的 docker compose。这在 MacOS 上完美运行。在 Windows 上使用完全相同的 docker 设置虽然在 Wordpress 中让我得到这些消息。

尝试上传媒体 尝试上传媒体

尝试更新 Wordpress 尝试更新 Wordpress

显然,Worpress 没有正确的文件权限。

我试过的

1. 检查 Docker for Windows 设置并升级到 WSL 2

我现在正在使用基于 WSL 2 的引擎,它应该为系统上的所有文件提供完全的 root 权限。我升级到 WPL 2,因为我第一次使用基于 Hyper-V 的后端(当然还有正确的文件权限设置),我尝试通过升级来解决问题。没运气。

2. 试验chmodchown

首先,我添加chmod -R 777 /var/www/html/到 Dockerfile。据我所知,这应该将所有文件权限授予 root。它没有任何效果。所以也许我正在使用不同的用户?不过,该命令whoami确实让我重新获得了 root 权限。
也许我做错了什么,而用户是别的东西。所以我添加了chown -R www-data:www-data /var,因为我看到 www-data 应该是默认的 Docker 用户和组。没运气。

只是为了好玩,我还尝试chmod -R 777 /var/www/html/wp-content/uploads/在路径中更加具体。有趣的是,这给了我错误chmod: cannot access '/var/www/html/wp-content/uploads/': No such file or directory。不过,我确实链接了文件夹,这有效(我可以在 IntelliJ 的文件夹结构中看到文件确实在 /var/www/html 中)。-R无论如何,该选项应该使这个递归,所以它应该无关紧要。

3. 在容器运行时做这一切

所以也许是因为文件还不存在,我无法分配权限。所以当容器实际运行时,我也尝试了所有这些。再一次,没有运气。

4. 以用户身份运行 root

首先,我user: root在我的docker-compose.yml. 没运气。
然后我添加USER root到 Dockerfile,就在FROM php:7.4-apache. 没运气。

5.使用官方Wordpress图片

正如您在下面看到的,我使用 apache 映像作为我的 Dockerfile 的基础。我还尝试直接从我的docker-compose.yml(省略整个 Dockerfile)使用 wordpress:latest 图像,并尝试FROM: wordpress:latest在 Dockerfile 之上使用。两者都没有改变任何东西。

我的文件

到现在为止,我尝试了在互联网上可以找到的所有解决方案,但没有任何效果。疯狂的事情,所有这些在 MacOS 下都可以正常工作。这是我的 docker 文件,我希望你们能在这里帮助我。

docker-compose.yml

services:
  web:
    build:
      context: ./
      dockerfile: .docker/Dockerfile
    container_name: wolfpackvision.com
    ports:
    - "8080:80"
    volumes:
    - .:/var/www/html
Run Code Online (Sandbox Code Playgroud)

文件

FROM php:7.4-apache

#USER root

RUN apt-get update
RUN docker-php-ext-install mysqli

## Install composer
RUN curl -sS https://getcomposer.org/installer | php -- --install-dir=/usr/local/bin --filename=composer

## Install PHP-GD
RUN apt-get install -y libpng-dev libjpeg-dev libfreetype6-dev \
    && docker-php-ext-configure gd --with-freetype=/usr/include/ --with-jpeg=/usr/include/ \
    && docker-php-ext-install gd

## Install xdebug
RUN apt-get install --assume-yes --fix-missing git libzip-dev libmcrypt-dev openssh-client \
    libxml2-dev libpng-dev g++ make autoconf \
    && docker-php-source extract \
    && pecl install xdebug redis \
    && docker-php-ext-enable xdebug redis \
    && docker-php-source delete \
    && docker-php-ext-install pdo_mysql soap intl zip

## Configure xdebug
RUN echo "xdebug.remote_enable=on" >> /usr/local/etc/php/conf.d/docker-php-ext-xdebug.ini \
    && echo "xdebug.remote_autostart=off" >> /usr/local/etc/php/conf.d/docker-php-ext-xdebug.ini \
    && echo "xdebug.remote_port=9000" >> /usr/local/etc/php/conf.d/docker-php-ext-xdebug.ini \
    && echo "xdebug.remote_handler=dbgp" >> /usr/local/etc/php/conf.d/docker-php-ext-xdebug.ini \
    && echo "xdebug.remote_connect_back=0" >> /usr/local/etc/php/conf.d/docker-php-ext-xdebug.ini \
    && echo "xdebug.idekey=wolfpackvision.com" >> /usr/local/etc/php/conf.d/docker-php-ext-xdebug.ini \
    && echo "xdebug.remote_host=host.docker.internal" >> /usr/local/etc/php/conf.d/docker-php-ext-xdebug.ini

## Enable mod_rewrite http://httpd.apache.org/docs/current/mod/mod_rewrite.html & mod_headers http://httpd.apache.org/docs/current/mod/mod_headers.html
RUN a2enmod rewrite \
    && a2enmod headers

## Give Full folder permissions to server
#RUN chown -R www-data:www-data /var/www/html
#RUN chmod -R 777 /var/www/html/
#RUN chmod -R 777 /var/www/html/wp-content/uploads/
#RUN chmod -R 777 /var/www/html/
#RUN chmod -R 766 /var/www/html/

## Copy php.ini over
COPY ./.docker/php/php.ini /usr/local/etc/php

## Cleanup
RUN rm -rf /tmp/*
Run Code Online (Sandbox Code Playgroud)

-> 请不要警告我 777,我知道。这完全是本地的,我永远不会在生产中使用它。另外,如果我获得了权限,我可能会收紧它。首先,我希望它能够正常工作。

编辑

回应@user969068。
`docker exec -it ps aux` 给了我:
USER       PID %CPU %MEM    VSZ   RSS TTY      STAT START   TIME COMMAND
root         1  0.1  0.0  90652 28568 ?        Ss   11:04   0:00 apache2 -DFOREG
www-data    16  0.0  0.0  90684  8176 ?        S    11:04   0:00 apache2 -DFOREG
www-data    17  0.0  0.0  90684  8176 ?        S    11:04   0:00 apache2 -DFOREG
www-data    18  0.0  0.0  90684  8176 ?        S    11:04   0:00 apache2 -DFOREG
www-data    19  0.0  0.0  90684  8176 ?        S    11:04   0:00 apache2 -DFOREG
www-data    20  0.0  0.0  90684  8176 ?        S    11:04   0:00 apache2 -DFOREG
root        21  0.0  0.0   7640  2708 pts/0    Rs+  11:06   0:00 ps aux
Run Code Online (Sandbox Code Playgroud)

我已经尝试使用 PID 21、1 和 16 执行您推荐的操作。所有三个结果都相同;没有文件权限。我在这里缺少什么?

Sam*_*ser 0

感谢您的帮助。事实证明,这个问题与 Docker 无关。WordPress 配置为在我的主机文件夹结构中查找上传目录,将其设置为 /wp-content/uploads 修复了所有内容。

还是要谢谢你的帮助!