No docker, os arquivos criados dentro de contêineres tendem a ter propriedade imprevisível durante a inspeção do host. O proprietário dos arquivos em um volume é root (uid 0) por padrão, mas assim que contas de usuário não root estão envolvidas no contêiner e gravando no sistema de arquivos, os proprietários se tornam mais ou menos aleatórios da perspectiva do host.
É um problema quando você precisa acessar os dados de volume do host usando a mesma conta de usuário que está chamando os comandos docker.
Soluções alternativas típicas são
- forçar uIDs de usuários no momento da criação em Dockerfiles (não portátil)
- passando o UID do usuário host para o
docker run
comando como uma variável de ambiente e, em seguida, executando algunschown
comandos nos volumes em um script de ponto de entrada.
Ambas as soluções podem fornecer algum controle sobre as permissões reais fora do contêiner.
Eu esperava que os namespaces do usuário fossem a solução final para esse problema. Executei alguns testes com a versão 1.10 lançada recentemente e --userns-remap definido para minha conta de desktop. No entanto, não tenho certeza se isso pode tornar mais fácil lidar com a propriedade de arquivos em volumes montados, infelizmente poderia ser o contrário.
Suponha que eu inicie este contêiner básico
docker run -ti -v /data debian:jessie /bin/bash
echo 'hello' > /data/test.txt
exit
Em seguida, inspecione o conteúdo do host:
ls -lh /var/lib/docker/100000.100000/volumes/<some-id>/_data/
-rw-r--r-- 1 100000 100000 6 Feb 8 19:43 test.txt
Este número '100000' é um sub-UID do meu usuário host, mas como não corresponde ao UID do meu usuário, ainda não consigo editar o test.txt sem privilégios. Este subusuário não parece ter nenhuma afinidade com meu usuário regular real fora do docker. Não está mapeado de volta.
As soluções alternativas mencionadas anteriormente nesta postagem, que consistiam em alinhar UIDs entre o host e o contêiner, não funcionam mais devido ao UID->sub-UID
mapeamento que ocorre no namespace.
Então, há uma maneira de executar o docker com o namespace do usuário habilitado (para maior segurança), enquanto ainda possibilita que o usuário host que executa o docker possua os arquivos gerados nos volumes?