权限问题:如何在Windows的docker上设置权限以与Wordpress

问题描述

问题

我正在尝试使用适用于Wordpress的Windows版Docker设置我的开发环境。我正在使用带有自定义Dockerfile的docker compose。这在MacOS上完美运行。 在Windows上使用完全相同的docker设置,虽然可以在Wordpress中获得这些消息。

尝试上传媒体

Trying to upload media

尝试更新Wordpress

Trying to update Wordpress

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

我尝试过的

1。检查Docker的Windows设置并升级到WSL 2

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

2。试用chmodchown

首先,我将chmod -R 777 /var/www/html/添加到了Dockerfile中。据我所知,这应该赋予所有文件root权限。它没有任何作用。所以也许我正在使用其他用户?命令whoami确实让我回了头。
也许我做错了什么,而用户又是别的。所以我添加了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添加到了FROM php:7.4-apache下方的Dockerfile中。没有运气。

5。使用官方的Wordpress图片

如下所示,我将apache映像用作Dockerfile的基础。我还尝试直接从我的docker-compose.yml中使用wordpress:latest映像(忽略整个Dockerfile),并尝试在Dockerfile之上使用FROM: wordpress:latest。两者都没改变。

我的文件

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

docker-compose.yml

services:
  web:
    build:
      context: ./
      dockerfile: .docker/Dockerfile
    container_name: wolfpackvision.com
    ports:
    - "8080:80"
    volumes:
    - .:/var/www/html

Dockerfile

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/*

->请不要警告我有关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

我已经尝试按照PID 21、1和16的要求进行操作。所有三个结果都相同。没有文件权限。我在这里想念什么?

解决方法

我认为您使用用户的问题有所不同,php:7.4-apache使用www-data作为用户。在运行时确认用户(将php:7.4-apache替换为您的图片名称)

docker run -d php:7.4-apache

然后运行

docker exec -it YOUR_IMAGE_HASH ps aux

它应该在正在运行的进程的“用户”列下向您显示www-data。 确定正确的用户后,您可以将其添加到docker文件中,例如

FROM php:7.4-apache
.....
ARG user_id=1000
RUN usermod -u $user_id www-data
,

我不是WSL方面的专家,但我想您的问题不在容器内,这似乎是主机权限问题。容器进程无法写入.目录(这意味着您启动docker-compose时是当前目录)。

这里是some related issues

我将检查从哪个用户运行Docker进程,并尝试从该用户向目录中写入内容。 我也建议使用named volumes。我相信默认情况下,Windows主机上新创建的卷应具有读/写权限。

,

您的问题与已知的Docker bug有关,其中的一点描述here

基本上,问题是Windows卷不尊重文件的原始权限,并且在初始化容器后,任何更改都将所有内容分配给root,我在另一个CMS中遇到了类似的问题,最后决定为了使apache能够以root身份运行以进行开发,以便它可以读取文件,并且通常可以将其用于生产环境,this就如何实现这一点给了我一些想法。

相关问答

依赖报错 idea导入项目后依赖报错,解决方案:https://blog....
错误1:代码生成器依赖和mybatis依赖冲突 启动项目时报错如下...
错误1:gradle项目控制台输出为乱码 # 解决方案:https://bl...
错误还原:在查询的过程中,传入的workType为0时,该条件不起...
报错如下,gcc版本太低 ^ server.c:5346:31: 错误:‘struct...