'Wordpress on Docker: Could not create directory on mounted volume
Here is are the original files in the Wordpress Docker container on path /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
I am trying to start the Wordpress container with a mounted Docker volume to be able to store the custom files persistently:
$ sudo docker run -p 80:80 --link some-mysql:mysql -v /var/www:/var/www/html --name docker-wordpress -d wordpress
The problem is that even when exactly replicating the ownership and priviledges on local files in /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 {} \;
I am still getting an error of this kind, when running Wordpress inside the container:
Could not create directory
How to set the privileges properly to make sure Wordpress is able to write into the mounted Docker volume?
Solution 1:[1]
Looking at your error message i come to the conclusion that you are trying to install a plugin or update wordpress itself
This issue is slightly tricky to figure out.
executing chown -R www-data:www-data /var/www
to set correct user:group permissions should technically solve it, however ..
On a new wordpress install the upload
& plugins
folder does not yet exist and therefore when installer trying to create a plugins/subfolder
it will throw the error.
How to Fix Wordpress / Docker Plugin install Permission issue
Fixing this issue is however quite easy once grasping it.
Option A
in your .Docker
file add following towards the very end but before any [CMD]
command.
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 {} \;
Option B
ssh in to your docker containerdocker exec -it <container_name> /bin/bash
If you don't know the container name find it withdocker ps
Simply run same commands as in example above$ 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 {} \;
Solution 2:[2]
Building up on Mathias Asberg answer, you can simply create 2 folder i.e plugins and uploads update the permission to 777 and mount the volumes
Steps:
mkdir plugins uploads
chmod -R 777 plugins uploads
- update docker-compose.yaml to mount volume
volumes: #
- ./plugins:/var/www/html/wp-content/plugins
- ./uploads:/var/www/html/wp-content/uploads
Solution 3:[3]
I had a similar issue where I was using a mounted volume and wanted to ensure files could be managed on both the host operating system and by the WordPress docker image.
Within docker, the WordPress site runs as a user www-data with UID 82; this also has an associated www-data group, again with a group id of 82. By creating a group on the host OS with the same id as www-data and changing the group ownership to that group both host and docker image can manage the files.
In this example we add give access rights to a user named ec2-user on the host OS; all scripts are run on host OS:
- First check there is an existing user or group on the host with the same id as www-data:
getent group | grep 82
cat /etc/passwd | grep 82
- Assuming there is no user/group conflict, create a group on host with same group id as the www-data group within docker and add any required users to that group; this example uses the same group name on the host:
sudo groupadd -g 82 www-data
sudo usermod -a -G www-data ec2-user
- Finally, change the group ownership of files and update permissions to give the www-data group read and write permissions on both host and in docker:
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 {} \;
This results in the follow permissions within the docker image, where both the ec2-user on the host and www-data with docker can read/write all files and folders within 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
Sources
This article follows the attribution requirements of Stack Overflow and is licensed under CC BY-SA 3.0.
Source: Stack Overflow
Solution | Source |
---|---|
Solution 1 | Mathias Asberg |
Solution 2 | Shubham Negi |
Solution 3 |