Ao configurar e executar uma instância do Docker, na inicialização o nginx fornece uma mensagem 403 Forbidden
ao acessar arquivos estáticos.
No Dockerfile
, eu uso o COPY
comando para mover todos os arquivos para /var/www/app
, depois uso o RUN
comando para chmod
o diretório estático para permitir que o www-data
usuário leia os arquivos.
Fica Dockerfile
assim:
...
COPY app /var/www/app
RUN chmod -R go+rX /var/www/app/static
...
Após investigação (executando o bash interativamente na instância), descobri que o usuário www-data não pode ler os arquivos ou listar os diretórios, a menos que o usuário root faça isso primeiro. Isso é o que considero realmente confuso - é como se as permissões listadas fossem completamente ineficazes até que o usuário root examine os arquivos.
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
Como isso pode ser? Por que a execução ls
faz com que as permissões efetivas aparentemente mudem?
Responder1
Você usou ADD nesse Dockerfile? Evite ADD, pois após essa instrução todos os novos arquivos e diretórios são criados com UID e GID 0.