При настройке и запуске экземпляра Docker при загрузке nginx выдает ошибку 403 Forbidden
при доступе к статическим файлам.
В Dockerfile
я использую COPY
команду для перемещения всех файлов в /var/www/app
, а затем я использую RUN
команду для chmod
статического каталога, чтобы позволить www-data
пользователю читать файлы.
Выглядит это Dockerfile
примерно так:
...
COPY app /var/www/app
RUN chmod -R go+rX /var/www/app/static
...
После расследования (запуская bash в интерактивном режиме на экземпляре) я обнаружил, что пользователь www-data не может читать файлы или выводить список каталогов, если этого не сделает пользователь root. Это то, что я нахожу действительно запутанным — как будто перечисленные разрешения полностью неэффективны, пока пользователь root не просмотрит файлы.
root@0e4b48a67a72:/# sudo -u www-data ls -la /var/www/app/static/js
ls: cannot access /var/www/app/static/js: Permission denied
root@0e4b48a67a72:/# ls -la /var/www/app/static/js
total 100
drwxr-xr-x 2 root root 4096 Oct 9 02:40 .
drwxr-xr-x 10 root root 4096 Oct 9 02:40 ..
-rw-r--r-- 1 root root 93868 Oct 6 13:39 jquery.js
root@0e4b48a67a72:/# sudo -u www-data ls -la /var/www/app/static/js
total 100
drwxr-xr-x 2 root root 4096 Oct 9 02:40 .
drwxr-xr-x 10 root root 4096 Oct 9 02:40 ..
-rw-r--r-- 1 root root 93868 Oct 6 13:39 jquery.js
Как это может быть? Почему запуск ls
приводит к тому, что эффективные разрешения, по-видимому, меняются?
решение1
Вы использовали ADD в этом Dockerfile? Избегайте ADD, поскольку после этой инструкции все новые файлы и каталоги создаются с UID и GID 0.