Considere o seguinte contêiner do Docker:
docker run --rm -it -v /tmp:/mnt/tmp alpine sh
Isso monta o diretório do host / tmp em / mnt / tmp dentro do contêiner alpino.
Agora, no sistema host, montei um volume NFS no diretório / tmp:
mkdir /tmp/nfs
mount -t nfs4 192.168.1.100:/data /tmp/nfs
A montagem funciona no sistema host e vejo o seguinte:
# ls /tmp/nfs
file1 file2 file3
#
Mas no Docker Container, vejo um diretório em branco:
# ls /mnt/tmp/nfs
#
Eu sei que posso contornar isso fazendo a montagem diretamente no Docker Container. Mas estou realmente interessado em saber por que a montagem funciona no contêiner do host, mas não no contêiner do docker?
Respostas:
Isso acontece porque o volume está usando a
private
propagação de montagem. Isso significa que quando a montagem acontecer, quaisquer alterações que ocorram no lado de origem (por exemplo, o lado "host" no caso do Docker) não serão visíveis embaixo da montagem.Existem algumas maneiras de lidar com isso:
Primeiro, monte o NFS e inicie o contêiner. A montagem será propagada para o contêiner, no entanto, como antes, qualquer alteração na montagem não será vista pelo contêiner (incluindo desmontagens).
Use propagação "escrava". Isso significa que, uma vez criada a montagem, quaisquer alterações no lado de origem (host do docker) poderão ser vistas no destino (no contêiner). Se você estiver montando aninhados, convém usar
rslave
(r
para recursivo).Também há propagação "compartilhada". Esse modo faria com que as mudanças no ponto de montagem de dentro do contêiner se propagassem para o host, e vice-versa. Como seu usuário nem teria privilégios para fazer essas alterações (a menos que você adicione CAP_SYS_ADMIN), provavelmente não é isso que você deseja.
Você pode definir o modo de propagação ao criar a montagem da seguinte maneira:
A outra alternativa seria usar um volume em vez de uma montagem de host. Você pode fazer o seguinte:
Isso garantirá sempre a montagem no contêiner para você, não dependerá de ter o host configurado de alguma maneira específica ou de lidar com a propagação da montagem.
nota :
:
na parte da frente do caminho do dispositivo é necessário, apenas algo estranho no módulo do nfs kernel.note : No momento, o Docker não resolve a
<nfs host>
partir de um nome DNS (será em 1.13), portanto, você precisará fornecer o endereço IP aqui.Mais detalhes sobre montagens de "subárvore compartilhada": https://www.kernel.org/doc/Documentation/filesystems/sharedsubtree.txt
fonte
Ative a propagação de montagem compartilhada no volume incluindo o sinalizador: shared no final do argumento do volume:
Se o Docker foi instalado por meio de um gerenciador de pacotes ou script de instalação para systemd, pode ser necessário ajustar o argumento do daemon MountFlags. Para fazer isso, localize o arquivo docker.service:
No meu caso no Ubuntu 16.04, ele estava localizado em /etc/systemd/system/multi-user.target.wants/docker.service. Edite este arquivo com vi ou nano e verifique se a opção MountFlags lê:
Salve o arquivo, recarregue os argumentos do daemon e reinicie a janela de encaixe:
Agora você deve poder definir o sinalizador de propagação de montagem compartilhada em volumes ao usar "docker run".
fonte
A partir da janela de encaixe 17.06, é possível montar compartilhamentos NFS no contêiner diretamente quando você o executa, sem a necessidade de recursos extras
Como alternativa, você pode criar o volume antes do contêiner:
Obtenha a dica em https://github.com/moby/moby/issues/28809
fonte