Resolvendo Erros de Permissão Negada
Agora que entendemos a causa do erro de permissão negada, vamos explorar vários métodos para resolvê-lo.
Método 1: Modificando as Permissões do Arquivo no Host
A abordagem mais simples é alterar as permissões dos arquivos no seu host para permitir que outros usuários os acessem:
chmod 755 ~/project/docker-test/testfile.txt
Isso altera as permissões para 755 (-rwxr-xr-x), permitindo que qualquer pessoa leia e execute o arquivo, mas apenas o proprietário pode modificá-lo.
Vamos tentar acessar o arquivo de um container novamente:
docker run --rm -v ~/project/docker-test:/app ubuntu cat /app/testfile.txt
Agora você deve ver o conteúdo do arquivo:
This is a test file.
Isso funciona porque o arquivo agora é legível por "outros" no seu sistema host, o que inclui o usuário do container.
Método 2: Usando a Flag --user
Outra abordagem é dizer ao Docker para executar o container com o mesmo ID de usuário que o seu usuário host:
## Reset the file permissions to be restrictive
chmod 700 ~/project/docker-test/testfile.txt
## Get your user ID and group ID
USER_ID=$(id -u)
GROUP_ID=$(id -g)
## Run the container with your user ID
docker run --rm --user $USER_ID:$GROUP_ID -v ~/project/docker-test:/app ubuntu cat /app/testfile.txt
Você agora deve ser capaz de ler o conteúdo do arquivo, apesar de suas permissões restritivas:
This is a test file.
Isso funciona porque:
- Executamos o container com o mesmo ID de usuário que o seu usuário host
- As permissões no arquivo permitem o acesso a esse ID de usuário
- O Docker passa o ID de usuário para os processos do container
A flag --user é particularmente útil quando você precisa manter permissões restritivas em seus arquivos host.
Método 3: Ajustando os IDs de Proprietário e Grupo
Vamos criar um novo arquivo pertencente a um usuário diferente para demonstrar este método:
## Create a file as root
sudo bash -c 'echo "This is a root-owned file." > ~/project/docker-test/rootfile.txt'
sudo chown root:root ~/project/docker-test/rootfile.txt
sudo chmod 600 ~/project/docker-test/rootfile.txt
## Let's see what we have
ls -la ~/project/docker-test/
A saída deve mostrar:
total 16
drwxr-xr-x 2 labex labex 4096 XXX XX XX:XX .
drwxr-xr-x X labex labex 4096 XXX XX XX:XX ..
-rw------- 1 root root 25 XXX XX XX:XX rootfile.txt
-rwx------ 1 labex labex 19 XXX XX XX:XX testfile.txt
Agora tente acessar o arquivo pertencente ao root de um container executando como root:
docker run --rm -v ~/project/docker-test:/app ubuntu cat /app/rootfile.txt
Você deve ver o conteúdo:
This is a root-owned file.
Isso funciona porque:
- O container é executado como root (UID 0) por padrão
- O arquivo pertence ao root (UID 0) no host
- As permissões (600) permitem que o proprietário leia o arquivo
Isso demonstra que os IDs de usuário reais importam, não apenas os nomes. Quando o ID de usuário do container corresponde ao ID do proprietário do arquivo, as verificações de permissão serão bem-sucedidas se o proprietário tiver as permissões necessárias.