Docker Apache: 'chmod: изменение прав доступа к «файлу» Операция не разрешена » - PullRequest
3 голосов
/ 10 марта 2020

У меня Laravel приложение, развернутое в Azure Kubernetes с docker. У моего приложения возникают проблемы с загрузкой файлов, когда я пытаюсь загрузить файл, я получаю эту ошибку от Laravel (показывая только часть трассировки стека):

chmod (): операция не разрешена {" userId ": 1," exception ":" [object] (ErrorException (код: 0): chmod (): операция не разрешена в / var / www/my-app/vendor/league/flysystem/src/Adapter/Local.php: 367) [stacktrace]

# 0 [ внутренняя функция]: Подсветка \ Foundation \ Bootstrap \ HandleExceptions-> handleError (2, 'chmod (): Operat ...', '/ var / www/my-app...', 367, Array)

# 1 / var / www/my-app/vendor/league/flysystem/src/Adapter/Local.php (367): chmod ('/ var / www/my-app...', 420)

Однако в моем Dockerfile у меня есть «подбитая» папка хранения:

RUN chown -R www-data:www-data \
    /var/www/node-manager/storage \
    /var/www/node-manager/bootstrap/cache

Я должен упомянуть, что файл загружен, но не может продолжить работу с остальным кодом из-за исключения chmod.

В попытке отладить проблему, я запустил kubectl exec, чтобы получить оболочку в модуль, по умолчанию он регистрируется как root. I cd для загруженных файлов и пытается изменить права доступа как root, запустив chmod 420 nameOfFile.ext, и это работает, поэтому я изменяю его обратно к разрешениям 777. Однако, поскольку Laravel использует apache пользователя "www-data", я запускаю su www-data -s /bin/bash, затем пытаюсь изменить разрешение для того же файла, запустив chmod 420 nameOfFile.ext, и я получаю эту ошибку:

chmod: изменение разрешений "nameOfFile.ext" Операция не разрешена

Так что мне остается только удивляться, работает ли '-R' в chown только для файлов и папки, которые были непосредственно вложенным файлом или папкой. Таким образом, я переключился обратно на root пользователя, «выбив» папку, в которой находились файлы, затем переключился обратно на www-data пользователя и попытался запустить chmod для файла, но все равно получил ту же ошибку.

[EDIT] Я также должен упомянуть, что приложение использует файловый сервис Azure в качестве постоянного тома. Поменяет ли это на справку службы BLOB-объектов?

[РЕДАКТИРОВАТЬ] Вот как выглядит мой полный Dockerfile: https://pastebin.com/zLSyfqK8

Я уже занимался этим вопросом для какое-то время, любая помощь приветствуется. Дайте мне знать, если вам нужна другая необходимая информация.

1 Ответ

3 голосов
/ 11 марта 2020

Я также должен упомянуть, что приложение использует файловый сервис Azure в качестве постоянного тома.

В этом проблема. Azure Files предоставляет общий ресурс CIFS, который монтируется в Linux как cifs mount. Общие ресурсы CIFS не предоставляют разрешения для файлов типа UNIX и хранилище uid / gid типа UNIX.

При подключении общего ресурса CIFS машина Linux использует имя пользователя / пароль для аутентификации на сервере CIFS. Каждый доступ через это монтирование будет фактически использовать это имя пользователя на сервере CIFS, независимо от того, какой пользователь UNIX инициирует операции файловой системы. Согласно эта проблема GitHub , Azure Files не поддерживает расширения UNIX, а это означает, что клиент Linux должен будет эмулировать UNIX uid / gid & permissions. Сервер не хранит и не предоставляет эти параметры. Поэтому во время монтирования вам необходимо добавить параметры uid, gid, file_mode и dir_mode для установки этих данных.

Если вы используете монтирование CIFS на уровне ОС (через /etc/fstab) или ручные команды монтирования CLI, вы должны добавить эти опции в команду монтирования (см. man mount.cifs ).

Например: mount -t cifs -o file_mode=0644,dir_mode=0755,uid=80,gid=80 ...

Если вы используются тома Kubernetes, вы должны добавить эти параметры к параметрам тома (см. Azure Общий доступ к файлам в Kubernetes ).

Например:

apiVersion: v1
kind: PersistentVolume
metadata:
  name: azurefile
spec:
  capacity:
    storage: 5Gi
  accessModes:
    - ReadWriteMany
  storageClassName: azurefile
  azureFile:
    secretName: azure-secret
    shareName: aksshare
    readOnly: false
  mountOptions:
  - dir_mode=0755
  - file_mode=0644
  - uid=80
  - gid=80
  - mfsymlinks
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...