Criar um volume local com opções de montagem
Nesta etapa, você aprenderá como criar um volume Docker local e especificar opções de montagem. As opções de montagem permitem que você controle como o sistema de arquivos é montado, como definir permissões, habilitar recursos específicos ou otimizar o desempenho.
Criaremos um volume local chamado myvolume3 e usaremos a opção o para especificar opções de montagem. Para este exemplo, definiremos as opções uid e gid para garantir que os arquivos criados no volume por um contêiner pertençam a um usuário e grupo específicos no host. Isso pode ser útil para gerenciar permissões ao compartilhar dados entre contêineres e o host.
Primeiro, vamos criar um diretório no host que usaremos como fonte para nosso volume. Isso não é estritamente necessário para um volume local padrão, mas ajuda a ilustrar como as opções de montagem podem afetar o sistema de arquivos subjacente.
mkdir -p ~/project/myvolumedata
Agora, vamos criar o volume myvolume3 usando o driver local e especificar a opção o com uid e gid. Usaremos o ID do usuário e do grupo do usuário labex atual. Você pode encontrar seu ID de usuário e grupo usando os comandos id -u e id -g.
USER_ID=$(id -u)
GROUP_ID=$(id -g)
docker volume create --driver local --opt type=none --opt device=/home/labex/project/myvolumedata --opt o=bind,uid=$USER_ID,gid=$GROUP_ID myvolume3
Vamos detalhar este comando:
docker volume create: O comando para criar um volume.
--driver local: Especifica o driver de volume local.
--opt type=none: Especifica que nenhum tipo de sistema de arquivos deve ser criado automaticamente. Estamos vinculando a um diretório existente.
--opt device=/home/labex/project/myvolumedata: Especifica o dispositivo a ser montado, que é o diretório que criamos no host. Observe o uso do caminho absoluto /home/labex/project/myvolumedata.
--opt o=bind,uid=$USER_ID,gid=$GROUP_ID: Passa as opções de montagem.
bind: Especifica uma montagem de ligação (bind mount), vinculando o volume ao dispositivo especificado (nosso diretório do host).
uid=$USER_ID: Define o ID do usuário para arquivos criados no volume para o ID do usuário atual.
gid=$GROUP_ID: Define o ID do grupo para arquivos criados no volume para o ID do grupo do usuário atual.
myvolume3: O nome do volume.
Você deve ver o nome do volume impresso no console.
Agora, vamos inspecionar o volume para ver as opções.
docker volume inspect myvolume3
Na saída, você deve ver o Driver como local, as Options incluindo type=none, device=/home/labex/project/myvolumedata e o=bind,uid=...,gid=... (com seus IDs de usuário e grupo). O Mountpoint será o mesmo que o caminho do device.
Em seguida, executaremos um contêiner e anexaremos este volume. Usaremos a imagem ubuntu e montaremos myvolume3 em /app dentro do contêiner. Em seguida, criaremos um arquivo dentro do diretório /app do contêiner e verificaremos sua propriedade no host.
Primeiro, puxe a imagem ubuntu se necessário.
docker pull ubuntu
Agora, execute o contêiner e crie um arquivo no volume montado.
docker run --rm -v myvolume3:/app ubuntu bash -c "echo 'Testing ownership' > /app/testfile.txt && ls -l /app/testfile.txt"
Este comando executa um contêiner ubuntu, monta myvolume3 em /app, escreve "Testing ownership" em /app/testfile.txt e, em seguida, lista os detalhes do arquivo dentro do contêiner. Você deve ver o arquivo listado com propriedade root dentro do contêiner, pois os contêineres normalmente são executados como root por padrão.
Agora, vamos verificar a propriedade do arquivo na máquina host no diretório ~/project/myvolumedata.
ls -l ~/project/myvolumedata/testfile.txt
Você deve ver que o arquivo testfile.txt pertence ao usuário e grupo labex no host, graças às opções de montagem uid e gid que especificamos ao criar o volume.
Finalmente, vamos limpar o diretório criado.
rm -rf ~/project/myvolumedata