ATUALIZAÇÃO 02-03-2016 : A partir do Docker 1.9.0, o Docker nomeou volumes que substituem os contêineres somente de dados . A resposta abaixo, assim como minha postagem no blog vinculada, ainda tem valor no sentido de pensar sobre os dados dentro da janela de encaixe, mas considere usar volumes nomeados para implementar o padrão descrito abaixo, em vez de contêineres.
Acredito que a maneira canônica de resolver isso é usando contêineres somente de dados . Com essa abordagem, todo o acesso aos dados do volume é feito por contêineres que usam-volumes-from
o contêiner de dados, portanto, o host uid / gid não importa.
Por exemplo, um caso de uso fornecido na documentação está fazendo backup de um volume de dados. Para fazer isso, outro contêiner é usado para fazer o backup viatar
e também usa-volumes-from
para montar o volume. Então, acho que o ponto principal do grok é: em vez de pensar em como obter acesso aos dados no host com as permissões adequadas, pense em como fazer o que for necessário - backups, navegação etc. - através de outro contêiner . Os próprios contêineres precisam usar uid / gids consistentes, mas não precisam mapear para nada no host, permanecendo portáteis.
Isso também é relativamente novo para mim, mas se você tiver um caso de uso específico, sinta-se à vontade para comentar e tentarei expandir a resposta.
ATUALIZAÇÃO : Para o caso de uso especificado nos comentários, você pode ter uma imagem some/graphite
para executar grafite e uma imagem some/graphitedata
como o contêiner de dados. Portanto, ignorando portas e outras coisas, a Dockerfile
imagem some/graphitedata
é algo como:
FROM debian:jessie
# add our user and group first to make sure their IDs get assigned consistently, regardless of other deps added later
RUN groupadd -r graphite \
&& useradd -r -g graphite graphite
RUN mkdir -p /data/graphite \
&& chown -R graphite:graphite /data/graphite
VOLUME /data/graphite
USER graphite
CMD ["echo", "Data container for graphite"]
Crie e crie o contêiner de dados:
docker build -t some/graphitedata Dockerfile
docker run --name graphitedata some/graphitedata
O some/graphite
Dockerfile também deve receber o mesmo uid / gids, portanto, pode ser algo como isto:
FROM debian:jessie
# add our user and group first to make sure their IDs get assigned consistently, regardless of other deps added later
RUN groupadd -r graphite \
&& useradd -r -g graphite graphite
# ... graphite installation ...
VOLUME /data/graphite
USER graphite
CMD ["/bin/graphite"]
E seria executado da seguinte maneira:
docker run --volumes-from=graphitedata some/graphite
Ok, agora isso nos fornece nosso contêiner de grafite e um contêiner somente de dados associado ao usuário / grupo correto (observe que você pode reutilizar o some/graphite
contêiner para o contêiner de dados, substituindo o entrypoing / cmd ao executá-lo, mas tendo-o como imagens separadas O IMO é mais claro).
Agora, digamos que você queira editar algo na pasta de dados. Portanto, em vez de vincular a montagem do volume ao host e editá-lo lá, crie um novo contêiner para fazer esse trabalho. Vamos chamá-lo some/graphitetools
. Permite também criar o usuário / grupo apropriado, assim como a some/graphite
imagem.
FROM debian:jessie
# add our user and group first to make sure their IDs get assigned consistently, regardless of other deps added later
RUN groupadd -r graphite \
&& useradd -r -g graphite graphite
VOLUME /data/graphite
USER graphite
CMD ["/bin/bash"]
Você pode tornar esse DRY herdando some/graphite
ousome/graphitedata
na Dockerfile, ou em vez de criar uma nova imagem apenas um dos existentes re-uso (substituindo entrypoint / cmd, se necessário).
Agora, você simplesmente executa:
docker run -ti --rm --volumes-from=graphitedata some/graphitetools
e depois vi /data/graphite/whatever.txt
. Isso funciona perfeitamente porque todos os contêineres têm o mesmo usuário de grafite com uid / gid correspondente.
Como você nunca monta a /data/graphite
partir do host, não se importa como o uid / gid do host é mapeado para o uid / gid definido dentro do graphite
egraphitetools
contêineres . Esses contêineres agora podem ser implantados em qualquer host e continuarão funcionando perfeitamente.
O mais interessante disso é que graphitetools
poderia ter todos os tipos de utilitários e scripts úteis, que agora você também pode implantar de maneira portátil.
ATUALIZAÇÃO 2 : Depois de escrever esta resposta, decidi escrever uma postagem de blog mais completa sobre essa abordagem. Espero que ajude.
ATUALIZAÇÃO 3 : Corrigi esta resposta e adicionei mais detalhes. Antes, ele continha algumas suposições incorretas sobre propriedade e permissões - a propriedade geralmente é atribuída no momento da criação do volume, ou seja, no contêiner de dados, porque é quando o volume é criado. Veja este blog . Porém, isso não é um requisito - você pode simplesmente usar o contêiner de dados como uma "referência / manipulador" e definir a propriedade / permissões em outro contêiner via chown em um ponto de entrada, que termina com gosu para executar o comando como o usuário correto. Se alguém estiver interessado nessa abordagem, comente e eu posso fornecer links para uma amostra usando essa abordagem.