Gerenciando as Permissões de Montagem de Volume
Os volumes Docker permitem que você compartilhe dados entre o host e os contêineres. No entanto, gerenciar as permissões corretamente ao usar volumes é importante para evitar problemas. Nesta etapa, aprenderemos como lidar com as permissões ao usar montagens de volume.
Compreendendo os Problemas de Permissão de Montagem de Volume
O principal desafio com as montagens de volume Docker é que os IDs de usuário dentro do contêiner podem não corresponder aos IDs de usuário no sistema host. Isso pode levar a problemas de permissão ao acessar arquivos em volumes montados.
Vamos demonstrar esse problema com um exemplo simples.
Primeiro, crie um novo diretório no host que montaremos em um contêiner:
mkdir -p ~/project/host-data
cd ~/project/host-data
Crie um arquivo de teste neste diretório:
echo "This is a test file created on the host" > host-file.txt
Verifique a propriedade deste arquivo:
ls -l host-file.txt
Você deve ver que o arquivo pertence ao usuário labex (seu usuário atual no host):
-rw-r--r-- 1 labex labex 39 May 15 13:00 host-file.txt
Agora, vamos executar um contêiner que monta este diretório e tentar modificar o arquivo:
docker run -it --rm -v ~/project/host-data:/container-data ubuntu:22.04 bash
Você está agora dentro do contêiner. Vamos verificar a propriedade do arquivo montado:
ls -l /container-data/host-file.txt
Você pode ver uma saída semelhante a:
-rw-r--r-- 1 1000 1000 39 May 15 13:00 /container-data/host-file.txt
Observe que o arquivo mostra IDs numéricos em vez de nomes de usuário porque o contêiner não conhece o usuário labex do host.
Tente criar um novo arquivo no diretório montado:
echo "This is a test file created in the container" > /container-data/container-file.txt
Agora, verifique a propriedade deste novo arquivo:
ls -l /container-data/container-file.txt
Você deve ver:
-rw-r--r-- 1 root root 47 May 15 13:05 /container-data/container-file.txt
O arquivo pertence ao usuário root dentro do contêiner (já que estamos executando como root por padrão).
Saia do contêiner:
exit
Agora, verifique a propriedade de ambos os arquivos no host:
ls -l ~/project/host-data/
Você verá que o arquivo criado de dentro do contêiner pertence ao root no host:
-rw-r--r-- 1 root root 47 May 15 13:05 container-file.txt
-rw-r--r-- 1 labex labex 39 May 15 13:00 host-file.txt
Isso pode levar a problemas de permissão se um usuário não-root no host precisar acessar ou modificar esses arquivos.
Resolvendo Problemas de Permissão de Volume
Existem várias maneiras de resolver problemas de permissão de volume. Vamos explorar algumas abordagens comuns.
Abordagem 1: Definir o Usuário no Dockerfile para Corresponder ao Usuário do Host
Crie um novo diretório para este exemplo:
mkdir -p ~/project/volume-permissions
cd ~/project/volume-permissions
Crie um novo Dockerfile:
nano Dockerfile
Adicione o seguinte conteúdo:
FROM ubuntu:22.04
## Crie um usuário com o mesmo UID que o usuário do host
RUN useradd -m -u 1000 appuser
## Crie o diretório do aplicativo e defina a propriedade
RUN mkdir -p /app/data && chown -R appuser:appuser /app
## Defina o diretório de trabalho
WORKDIR /app
## Mude para appuser
USER appuser
## Comando para executar
CMD ["bash", "-c", "echo 'I can write to the mounted volume' > /app/data/test.txt && tail -f /dev/null"]
Salve e saia do editor.
Construa a imagem:
docker build -t volume-permissions-image .
Crie um diretório host para teste:
mkdir -p ~/project/volume-permissions/host-data
Execute um contêiner com o volume montado:
docker run -d --name volume-test -v ~/project/volume-permissions/host-data:/app/data volume-permissions-image
Após um momento, verifique a propriedade do arquivo criado no host:
ls -l ~/project/volume-permissions/host-data/
Você deve ver que o arquivo pertence a um usuário com UID 1000, que deve corresponder ao UID do seu usuário host:
-rw-r--r-- 1 labex labex 35 May 15 13:15 test.txt
Essa abordagem funciona porque criamos um usuário no contêiner com o mesmo UID que o usuário do host.
Abordagem 2: Usando a Flag --user
Outra abordagem é usar a flag --user para especificar qual ID de usuário usar ao executar o contêiner.
Primeiro, limpe o contêiner anterior:
docker stop volume-test
docker rm volume-test
Agora, execute um contêiner com a flag --user:
docker run -d --name user-flag-test --user "$(id -u):$(id -g)" -v ~/project/volume-permissions/host-data:/data ubuntu:22.04 bash -c "echo 'Created with --user flag' > /data/user-flag-test.txt && sleep 3600"
Este comando executa o contêiner com seu ID de usuário e ID de grupo atuais.
Verifique a propriedade do novo arquivo:
ls -l ~/project/volume-permissions/host-data/user-flag-test.txt
Você deve ver que o arquivo pertence ao seu usuário host:
-rw-r--r-- 1 labex labex 23 May 15 13:20 user-flag-test.txt
Vamos limpar antes de passar para a próxima etapa:
docker stop user-flag-test
docker rm user-flag-test
Essas abordagens demonstram como gerenciar permissões ao usar volumes Docker. Ao corresponder os IDs de usuário entre o contêiner e o host, você pode evitar problemas de permissão ao compartilhar dados entre eles.