Wordpress on Docker:无法在已挂载的卷上创建目录

21

以下是 Wordpress Docker 容器中路径 /var/www/html 中的原始文件:

$ docker exec 5b957c7b9c5ad054883694afbfb80d3c9df6707458d55011f471be0701f3890c ls -l
total 192
-rw-r--r--  1 www-data www-data   418 Sep 25  2013 index.php
-rw-r--r--  1 www-data www-data 19935 Jan  2 18:51 license.txt
-rw-r--r--  1 www-data www-data  7433 Jan 11 17:46 readme.html
-rw-r--r--  1 www-data www-data  5447 Sep 27  2016 wp-activate.php
drwxr-xr-x  9 www-data www-data  4096 May 16 21:50 wp-admin
-rw-r--r--  1 www-data www-data   364 Dec 19  2015 wp-blog-header.php
-rw-r--r--  1 www-data www-data  1627 Aug 29  2016 wp-comments-post.php
-rw-r--r--  1 www-data www-data  2764 May 29 22:19 wp-config-sample.php
-rw-r--r--  1 www-data www-data  3148 May 29 22:19 wp-config.php
drwxr-xr-x  4 www-data www-data  4096 May 16 21:50 wp-content
-rw-r--r--  1 www-data www-data  3286 May 24  2015 wp-cron.php
drwxr-xr-x 18 www-data www-data 12288 May 16 21:50 wp-includes
-rw-r--r--  1 www-data www-data  2422 Nov 21  2016 wp-links-opml.php
-rw-r--r--  1 www-data www-data  3301 Oct 25  2016 wp-load.php
-rw-r--r--  1 www-data www-data 33939 Nov 21  2016 wp-login.php
-rw-r--r--  1 www-data www-data  8048 Jan 11 05:15 wp-mail.php
-rw-r--r--  1 www-data www-data 16255 Apr  6 18:23 wp-settings.php
-rw-r--r--  1 www-data www-data 29896 Oct 19  2016 wp-signup.php
-rw-r--r--  1 www-data www-data  4513 Oct 14  2016 wp-trackback.php
-rw-r--r--  1 www-data www-data  3065 Aug 31  2016 xmlrpc.php

我正在尝试使用挂载的Docker卷启动WordPress容器,以便能够持久地存储自定义文件:

$ sudo docker run -p 80:80 --link some-mysql:mysql  -v /var/www:/var/www/html --name docker-wordpress -d wordpress
问题在于,即使在 /var/www 中完全复制了本地文件的所有权和权限:
$ sudo chown -R www-data:www-data /var/www
$ sudo find /var/www/ -type d -exec chmod 755 {} \;
$ sudo find /var/www/ -type f -exec chmod 644 {} \;

在容器中运行WordPress时,我仍然遇到以下类型的错误:

无法创建目录

如何正确设置权限以确保WordPress能够写入挂载的Docker卷?

3个回答

35

看起来您的错误信息表明您正在尝试安装插件或更新 WordPress 本身。

此问题有点棘手。

执行 chown -R www-data:www-data /var/www 以设置正确的用户和组权限技术上应该可以解决,但是......

在新的 WordPress 安装中,uploadplugins 文件夹尚不存在,因此当安装程序尝试创建 plugins/subfolder 时,它会抛出错误。

如何解决 Wordpress/Docker 插件安装权限问题

一旦理解,解决此问题其实很容易。

选项 A

在您的 .Docker 文件中,在任何 [CMD] 命令之前,添加以下内容:

RUN mkdir /var/www/html/wp-content/plugins
RUN mkdir /var/www/html/wp-content/uploads
RUN chown -R www-data:www-data /var/www
RUN find /var/www/ -type d -exec chmod 0755 {} \;
RUN find /var/www/ -type f -exec chmod 644 {} \;

选项 B

通过 SSH 连接到 Docker 容器
docker exec -it <container_name> /bin/bash

如果您不知道容器名称,请使用以下命令查找
docker ps

然后只需运行与上面示例相同的命令即可。

$ mkdir /var/www/html/wp-content/plugins
$ mkdir /var/www/html/wp-content/uploads
$ chown -R www-data:www-data /var/www
$ find /var/www/ -type d -exec chmod 0755 {} \;
$ find /var/www/ -type f -exec chmod 644 {} \;

创建目录 "/var/www/html/wp-content/plugins"。
创建目录 "/var/www/html/wp-content/uploads"。
将 "/var/www" 目录下的所有文件和目录的拥有者和所在组都设为 "www-data"。
将 "/var/www" 目录及其子目录下的所有目录权限设为 0755。
将 "/var/www" 目录及其子目录下的所有文件权限设为 0644。

1
当我试图创建插件目录时,我遇到了以下错误:mkdir: cannot create directory '/var/www/html/wp-content/plugins': No such file or directory。您有任何想法为什么会出现这种情况吗?Dockerfile: https://pastebin.com/fZgW50fr - Yanick van Barneveld
你需要在 mkdir 命令后面加上 -p 标志,例如 $ mkdir -p /the/path。选项 A 对我无效,但选项 B 可以。 - Eric Guan

0

我曾经遇到过类似的问题,我使用了一个挂载卷,并希望在主机操作系统和 WordPress docker 镜像中都能管理文件。

在 docker 中,WordPress 站点以 UID 82 的用户 www-data 运行;这也有一个关联的 www-data 组,组 ID 也为 82。通过在主机 OS 上创建一个与 www-data 相同 ID 的组,并将组所有权更改为该组,主机和 docker 镜像都可以管理文件。

在此示例中,我们为主机 OS 上的名为 ec2-user 的用户添加访问权限;所有脚本都在主机 OS 上运行:

  • 首先检查主机上是否存在与 www-data 相同 ID 的现有用户或组:
getent group | grep 82
cat /etc/passwd | grep 82
  • 假设没有用户/组冲突,在主机上创建一个与Docker中的www-data组具有相同组ID的组,并将任何必需的用户添加到该组中;此示例在主机上使用相同的组名:
sudo groupadd -g 82 www-data
sudo usermod -a -G www-data ec2-user

最后,更改文件的组所有权并更新权限,以便在主机和docker中都为www-data组提供读写权限:
sudo chgrp -R www-data ~/repos/site/html
find ~/repos/site/html -type d -exec chmod 0775 {} \;
find ~/repos/site/html -type f -exec chmod 664 {} \;

这将导致在 Docker 镜像中具有以下权限,其中主机上的 ec2-user 和 Docker 中的 www-data 均可以读写 html 中的所有文件和文件夹:

bash-5.0# ls -lah
total 248K
drwxrwxr-x    5 1000     www-data    4.0K Apr 25 09:03 .
drwxr-xr-x    3 root     root          18 Oct 21  2019 ..
-rw-rw-r--    1 1000     www-data     405 Apr 23 12:21 index.php
-rw-rw-r--    1 1000     www-data   19.1K Apr 23 12:21 license.txt
-rw-rw-r--    1 1000     www-data    7.3K Apr 23 12:21 readme.html
-rw-rw-r--    1 1000     www-data    7.0K Apr 23 12:21 wp-activate.php
drwxrwxr-x    9 1000     www-data    4.0K Apr 23 12:22 wp-admin
-rw-rw-r--    1 1000     www-data     351 Apr 23 12:21 wp-blog-header.php
-rw-rw-r--    1 1000     www-data    2.3K Apr 23 12:21 wp-comments-post.php
-rw-rw-r--    1 1000     www-data    2.8K Apr 23 12:35 wp-config-sample.php
-rw-rw-r--    1 1000     www-data    3.4K Apr 23 12:35 wp-config.php
drwxrwxr-x    6 1000     www-data      84 Apr 23 12:22 wp-content
-rw-rw-r--    1 1000     www-data    3.8K Apr 23 12:22 wp-cron.php
drwxrwxr-x   26 1000     www-data   12.0K Apr 23 12:22 wp-includes
-rw-rw-r--    1 1000     www-data    2.4K Apr 23 12:22 wp-links-opml.php
-rw-rw-r--    1 1000     www-data    3.8K Apr 23 12:22 wp-load.php
-rw-rw-r--    1 1000     www-data   46.8K Apr 23 12:22 wp-login.php
-rw-rw-r--    1 1000     www-data    8.4K Apr 23 12:22 wp-mail.php
-rw-rw-r--    1 1000     www-data   22.5K Apr 23 12:22 wp-settings.php
-rw-rw-r--    1 1000     www-data   31.2K Apr 23 12:22 wp-signup.php
-rw-rw-r--    1 1000     www-data    4.6K Apr 23 12:22 wp-trackback.php
-rw-rw-r--    1 1000     www-data    3.2K Apr 23 12:22 xmlrpc.php

0

在Mathias Asberg的回答基础上,您可以简单地创建2个文件夹,即插件和上传,将权限更新为777,并挂载卷

步骤:

  • mkdir plugins uploads
  • chmod -R 777 plugins uploads
  • 更新docker-compose.yaml以挂载卷
  volumes: # 
  - ./plugins:/var/www/html/wp-content/plugins
  - ./uploads:/var/www/html/wp-content/uploads

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接