O que são .dockerenv e .dockerinit?

4

Quais são os arquivos .dockerenv e .dockerinit na raiz do sistema de arquivos do meu contêiner? Como eles são usados? Existe alguma documentação sobre esses arquivos?

root@18ceee4f9041:/# ls -al /
total 72
drwxr-xr-x.  21 root root 4096 Jan  4 20:45 .
drwxr-xr-x.  21 root root 4096 Jan  4 20:45 ..
-rwxr-xr-x.   1 root root    0 Jan  4 20:45 .dockerenv
-rwxr-xr-x.   1 root root    0 Jan  4 20:45 .dockerinit

Outras pessoas fizeram perguntas semelhantes, mas não encontrei respostas:

Estou perguntando porque estou trabalhando em um bug em minha ferramenta de execução do docker chamada scuba . Você pode passar --user para docker run para definir o UID do processo em um contêiner, mas não tem entrada em / etc / passwd, então eu estava investigando opções para criar o usuário durante a inicialização do contêiner.

(Cross-posted no Stack Overflow , onde pode ser fechado.)

    
por Jonathon Reinhart 05.01.2016 / 00:19

2 respostas

4

AFAIK não há documentação oficial sobre eles.

Esses arquivos foram usados somente pelo antigo e driver de execução LXC obsoleto . Eles eram hacks exigidos pela janela de encaixe ao usar o LXC para executar os contêineres.

O .dockerinit era uma espécie de processo de inicialização . Foi o binário executado pelo comando lxc-attach chamado ao iniciar um contêiner. Foi o responsável por configurar o ambiente, o usuário e o diretório de trabalho e depois executar o seu entrypoint / cmd.

O .dockerenv continha as variáveis de ambiente definidas dentro do contêiner. Eles foram usados para configurar as variáveis de ambiente corretamente após o anexo lxc. Este arquivo foi lido pelo .dockerinit process .

O novo libcontainer / runc driver ( o driver ativado por padrão ) não usa esses arquivos. Você os encontrará vazios em seus contêineres. Na verdade, o suporte do LXC foi removido recentemente do ramo de desenvolvimento do docker .

Então, talvez esses arquivos desapareçam no futuro, embora atualmente sejam amplamente usados por aplicativos para detectar a presença do docker.

    
por 05.01.2016 / 06:13
1

Para descobrir se o código está sendo executado em um ambiente de encaixe, era popular testar a existência do arquivo /.dockerinit ou /.dockerenv .

Como o arquivo dockerinit foi removido em versões mais recentes, a melhor ideia agora deve ser verificar a existência do arquivo dockerenv.

  • Citando outra fonte :

    I'm not sure how official /.dockerenv is -- it's pretty much undocumented, but docker/libnetwork#815 seems to imply that it'll be longer-lived

Uma implementação de amostra de tal verificação do nosso código:

if ! [ -f /.dockerenv ] ; then
  echo "Not running inside docker, exiting to avoid data damage." >&2
  exit 1
fi
    
por 18.08.2016 / 17:21

Tags