Здравствуйте
есть сайт на php, поднимаю его в докере
на основе образа php:7.4-fpm
На сайте есть форма, через которую клиент должен отправить файл
а сервер должен его сохранить
Форма посылает запрос, я вижу в суперглобальном массиве $_FILES мой массив с temp_name и тп параметрами
На сколько я понимаю файл складываем в папку /temp на сервере (в моем контексте в докер контейнере)
ставил xdebug и останавливался - файл в папке temp действительно есть
Итак, у меня есть массив, теперь я его должен "сохранить" в нужной мне папке
делаю я это через
move_uploaded_file($file['tmp_name'], $absolutePath)
эта функция должна возвратить TRUE если все прошло
но не возвращает
Включил показ ошибок и предупреждений
и вижу там такая ошибка
move_uploaded_file(/app/upload/my_file.xlsx): failed to open stream: Permission denied in ....
move_uploaded_file(): Unable to move '/tmp/php5FnOTW' to '/app/upload/my_file.xlsx' in ...
Проблема с правами в докере
Помогите разложить все по полочкам в голове, понять проблему и решить ее
в php.ini у параметра upload_tmp_dir стоит null
как я понял в этом случае использует системная папка /temp
переходим внутрь контейнера
ниже вывод ls -la
- в папке с сайтом (upload)
- в корне контейнера (tmp)
drwxrwxr-x 24 1000 1000 4096 Jul 19 13:36 upload
drwxrwxrwt 1 root root 4096 Jul 19 14:52 tmp
1000 - это id моего юзера на хост машине (этот id пробрасывается и в контейнер)
root - это рут в контейнере
внутри контейнера посмотрел под кем работает php
/usr/local/etc/php-fpm.d/www.conf
user = www-data
group = www-data
его id в контейнере
uid=33(www-data) gid=33(www-data) groups=33(www-data)
на хост машине мой пользователь (с id 1000)
uid=1000(pankov) gid=1000(pankov) группы=1000(pankov),4(adm),24(cdrom),27(sudo),30(dip),46(plugdev),109(kvm),122(lpadmin),134(lxd),135(sambashare),999(docker)
хост система - убунта
Как я понял в temp складывается
права rwx \ rwx \ rwt (что за rwt??)
но пользователь и группа этой папки root
а php от www-data работает,
получается смотрим на последний 3 буквы (others) пермишенов - rwt
чтение и запись разрешена (что за t?)
Но сама ошибка говорит, что именно из temp нет возможности переместить в upload
перемещает, выходит, php, который работает от www-data
и этот www-data стучится в upload с r-x (для others) те только чтение (без записи) - поэтому ошибка?
(если я все верно понимаю, то каков способ ее решения? в какой момент давать права работая в докере)
На данный момент я окончательно запутался среди www-data / root / pankov пользователей