php - 权限问题:如何在 docker for windows 上设置权限以与 Wordpress 一起使用
问题描述
问题
我正在尝试使用 Docker for Windows 设置我的开发环境,以便与 Wordpress 一起使用。我正在使用带有自定义 Dockerfile 的 docker compose。这在 MacOS 上完美运行。在 Windows 上使用完全相同的 docker 设置虽然在 Wordpress 中得到了这些消息。显然,Worpress 没有正确的文件权限。
我试过的
1. 检查 Docker for Windows 设置并升级到 WSL 2
我现在正在使用基于 WSL 2 的引擎,它应该为系统上的所有文件提供完全的 root 权限。我在第一次使用基于 Hyper-V 的后端时升级到 WPL 2(当然还有正确的文件权限设置),我尝试通过升级来解决问题。没运气。
2. 试验chmod
和chown
首先,我添加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文件,我希望你们能在这里帮助我。
码头工人-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
推荐阅读
- fiware - 从 Orion Context Broker 订阅中检索数据失败
- python - 在 ipython 控制台中处理用户定义的类时出错
- javascript - Normalizr 转换模式的麻烦
- python - 如何获取属性值 Selenium + Python
- typescript - 如何使用装饰器向类添加新属性或方法?
- exiftool - 取消标记图片上的 Exiftool 地理标记
- regex - 在 Scala 中匹配多个正则表达式模式时忽略组
- docker - elasticsearch启动并在docker中运行后,如何运行searchguard设置脚本?
- react-native - 如何使用本机反应在按钮上定义点击区域?
- c# - Blueprism - 在电子邮件正文中突出显示收集列