问题描述
问题
我正在尝试使用适用于Wordpress的Windows版Docker设置我的开发环境。我正在使用带有自定义Dockerfile的docker compose。这在MacOS上完美运行。 在Windows上使用完全相同的docker设置,虽然可以在Wordpress中获得这些消息。很显然,Worpress没有正确的文件权限。
我尝试过的
1。检查Docker的Windows设置并升级到WSL 2
我现在正在使用基于WSL 2的引擎,该引擎应该为系统上的所有文件提供full root permissions。当我第一次使用基于Hyper-V的后端(当然具有正确的文件权限设置)时,我已升级到WPL 2,我尝试通过升级来解决问题。没有运气。
2。试用chmod
和chown
首先,我将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
时是当前目录)。
我将检查从哪个用户运行Docker进程,并尝试从该用户向目录中写入内容。 我也建议使用named volumes。我相信默认情况下,Windows主机上新创建的卷应具有读/写权限。
,您的问题与已知的Docker bug有关,其中的一点描述here
基本上,问题是Windows卷不尊重文件的原始权限,并且在初始化容器后,任何更改都将所有内容分配给root,我在另一个CMS中遇到了类似的问题,最后决定为了使apache能够以root身份运行以进行开发,以便它可以读取文件,并且通常可以将其用于生产环境,this就如何实现这一点给了我一些想法。