Задать вопрос
PankovAlxndr
@PankovAlxndr
Fullstack web developer

Как решить проблему permission denied при сохранении файла php?

Здравствуйте
есть сайт на 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 пользователей
  • Вопрос задан
  • 578 просмотров
Подписаться 3 Простой Комментировать
Пригласить эксперта
Ответы на вопрос 1
поменять атрибуты /tmp/upload на 777 не пробовали в Dockerfile?
типа
RUN chmod 777 /tmp/upload
чтоб ошибку побороть немедленно.. как *правильно* настроить пользователя следующий вопрос..
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы