权限问题:如何为 windows 设置 docker 的权限以便与 Wordpress 一起使用
Permission problem: How to setup permissions on docker for windows for use with Wordpress
问题
我正在尝试使用 Docker 为 Windows 设置我的开发环境,以便与 Wordpress 一起使用。我正在使用 docker 与自定义 Docker 文件组合。这在 MacOS 上完美运行。
在 Windows 上使用完全相同的 docker 设置虽然在 Wordpress 中得到了这些消息。
正在尝试上传媒体
正在尝试更新 Wordpress
显然,Worpress 没有正确的文件权限。
我试过的
1.检查 Docker 的 Windows 设置并升级到 WSL 2
我现在正在使用基于 WSL 2 的引擎,它应该为系统上的所有文件提供 full root permissions。我升级到 WPL 2,因为我第一次使用基于 Hyper-V 的后端(当然有正确的文件权限设置),我试图通过升级来解决问题。运气不好。
2。试验 chmod
和 chown
首先,我将 chmod -R 777 /var/www/html/
添加到 Docker 文件中。据我所知,这应该将所有文件权限授予 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
。虽然我做了 link 文件夹并且这有效(我可以在 IntelliJ 的文件夹结构中看到文件确实在 /var/www/html 中)。 -R
选项应该使这个递归无论如何,所以它不重要。
3。在容器 运行
时执行所有这些操作
所以可能是因为文件还不存在,我无法分配权限。所以当容器实际上是 运行 时,我也尝试了所有这些。再一次,运气不好。
4. 运行 作为用户 root
首先,我在 docker-compose.yml
的服务中添加了 user: root
。运气不好。
然后我将 USER root
添加到 Docker 文件中,就在 FROM php:7.4-apache
下面。运气不好。
5.使用官方 Wordpress 图片
正如您在下面看到的,我使用 apache 图像作为我的 Docker 文件的基础。我还尝试直接使用 docker-compose.yml
中的 wordpress:latest 图像(省略整个 Docker 文件),并尝试在 Docker 文件之上使用 FROM: wordpress:latest
。两者都没有改变任何东西。
我的文件
到目前为止,我已经尝试了所有可以在 Internet 上找到的解决方案,但没有任何效果。疯狂的事情,这一切在 MacOS 下都可以正常工作。这是我的 docker 文件,希望大家能帮帮我。
docker-compose.yml
services:
web:
build:
context: ./
dockerfile: .docker/Dockerfile
container_name: wolfpackvision.com
ports:
- "8080:80"
volumes:
- .:/var/www/html
Docker文件
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 执行您推荐的操作。这三个结果都相同;没有文件权限。我在这里错过了什么?
我不是 WSL 专家,但我猜你的问题不在容器内部,它似乎是主机权限问题。容器进程无法写入 .
目录(即启动时的当前目录 docker-compose
)。
我会检查 Docker 进程来自哪个用户 运行 并尝试从该用户向目录写入一些东西。
我还建议使用 named volumes。我相信新创建的卷在 Windows 主机上默认应该具有 r/w 权限。
我认为您的用户使用问题有所不同,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
它应该会在 运行ning 进程的用户列下显示 www-data
。
一旦您确定了正确的用户,您就可以添加到您的 docker 文件中,例如
FROM php:7.4-apache
.....
ARG user_id=1000
RUN usermod -u $user_id www-data
您的问题与知识有关Docker bug, a bit of it is described
基本上,问题是 windows 卷不尊重文件的原始权限,并且在容器初始化后发生任何更改时将所有内容分配给 root,我遇到了类似的问题另一个 CMS,最后决定启用 apache 运行 作为开发的根,这样它就可以读取文件,并且通常用于生产,this 给了我一些关于如何实现它的想法。
感谢您的帮助。
事实证明,这个问题与 Docker 无关。 WordPress 配置为在我的主机文件夹结构中查找上传目录,将其设置为 /wp-content/uploads 修复所有内容。
谢谢你的帮助!
我的 mac 遇到了同样的问题,我就这样做了。这不是这个问题的答案,但它可能对某人有所帮助。
可以帮助使用 MacOS 的人
sudo chown -R username /Users/username/.docker/contexts
问题
我正在尝试使用 Docker 为 Windows 设置我的开发环境,以便与 Wordpress 一起使用。我正在使用 docker 与自定义 Docker 文件组合。这在 MacOS 上完美运行。 在 Windows 上使用完全相同的 docker 设置虽然在 Wordpress 中得到了这些消息。正在尝试上传媒体
正在尝试更新 Wordpress
显然,Worpress 没有正确的文件权限。
我试过的
1.检查 Docker 的 Windows 设置并升级到 WSL 2
我现在正在使用基于 WSL 2 的引擎,它应该为系统上的所有文件提供 full root permissions。我升级到 WPL 2,因为我第一次使用基于 Hyper-V 的后端(当然有正确的文件权限设置),我试图通过升级来解决问题。运气不好。
2。试验 chmod
和 chown
首先,我将 chmod -R 777 /var/www/html/
添加到 Docker 文件中。据我所知,这应该将所有文件权限授予 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
。虽然我做了 link 文件夹并且这有效(我可以在 IntelliJ 的文件夹结构中看到文件确实在 /var/www/html 中)。 -R
选项应该使这个递归无论如何,所以它不重要。
3。在容器 运行
时执行所有这些操作所以可能是因为文件还不存在,我无法分配权限。所以当容器实际上是 运行 时,我也尝试了所有这些。再一次,运气不好。
4. 运行 作为用户 root
首先,我在 docker-compose.yml
的服务中添加了 user: root
。运气不好。
然后我将 USER root
添加到 Docker 文件中,就在 FROM php:7.4-apache
下面。运气不好。
5.使用官方 Wordpress 图片
正如您在下面看到的,我使用 apache 图像作为我的 Docker 文件的基础。我还尝试直接使用 docker-compose.yml
中的 wordpress:latest 图像(省略整个 Docker 文件),并尝试在 Docker 文件之上使用 FROM: wordpress:latest
。两者都没有改变任何东西。
我的文件
到目前为止,我已经尝试了所有可以在 Internet 上找到的解决方案,但没有任何效果。疯狂的事情,这一切在 MacOS 下都可以正常工作。这是我的 docker 文件,希望大家能帮帮我。
docker-compose.yml
services:
web:
build:
context: ./
dockerfile: .docker/Dockerfile
container_name: wolfpackvision.com
ports:
- "8080:80"
volumes:
- .:/var/www/html
Docker文件
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 执行您推荐的操作。这三个结果都相同;没有文件权限。我在这里错过了什么?
我不是 WSL 专家,但我猜你的问题不在容器内部,它似乎是主机权限问题。容器进程无法写入 .
目录(即启动时的当前目录 docker-compose
)。
我会检查 Docker 进程来自哪个用户 运行 并尝试从该用户向目录写入一些东西。 我还建议使用 named volumes。我相信新创建的卷在 Windows 主机上默认应该具有 r/w 权限。
我认为您的用户使用问题有所不同,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
它应该会在 运行ning 进程的用户列下显示 www-data
。
一旦您确定了正确的用户,您就可以添加到您的 docker 文件中,例如
FROM php:7.4-apache
.....
ARG user_id=1000
RUN usermod -u $user_id www-data
您的问题与知识有关Docker bug, a bit of it is described
基本上,问题是 windows 卷不尊重文件的原始权限,并且在容器初始化后发生任何更改时将所有内容分配给 root,我遇到了类似的问题另一个 CMS,最后决定启用 apache 运行 作为开发的根,这样它就可以读取文件,并且通常用于生产,this 给了我一些关于如何实现它的想法。
感谢您的帮助。 事实证明,这个问题与 Docker 无关。 WordPress 配置为在我的主机文件夹结构中查找上传目录,将其设置为 /wp-content/uploads 修复所有内容。
谢谢你的帮助!
我的 mac 遇到了同样的问题,我就这样做了。这不是这个问题的答案,但它可能对某人有所帮助。 可以帮助使用 MacOS 的人
sudo chown -R username /Users/username/.docker/contexts