A execução do Docker no Docker (também conhecido como dind ), embora possível, deve ser evitada, se possível. (Fonte fornecida abaixo.) Em vez disso, você deseja configurar uma maneira de o seu contêiner principal produzir e se comunicar com os contêineres irmãos .
Jérôme Petazzoni - o autor do recurso que possibilitou a execução do Docker dentro de um contêiner do Docker - na verdade escreveu uma postagem no blog dizendo para não fazê-lo . O caso de uso que ele descreve corresponde ao caso de uso exato do OP de um contêiner do CI Docker que precisa executar tarefas em outros contêineres do Docker.
Petazzoni lista duas razões pelas quais o dind é problemático:
- Não coopera bem com o Linux Security Modules (LSM).
- Ele cria uma incompatibilidade nos sistemas de arquivos que cria problemas para os contêineres criados dentro dos contêineres pai.
A partir dessa postagem do blog, ele descreve a seguinte alternativa,
[A] maneira mais simples é apenas expor o soquete do Docker ao seu contêiner de CI, montando-o com o -v
sinalizador.
Simplificando, quando você inicia seu contêiner de IC (Jenkins ou outro), em vez de hackear algo junto com o Docker-in-Docker, inicie-o com:
docker run -v /var/run/docker.sock:/var/run/docker.sock ...
Agora, esse contêiner terá acesso ao soquete do Docker e, portanto, poderá iniciar os contêineres. Exceto que, em vez de iniciar contêineres "filho", ele iniciará contêineres "irmãos".