Se debe evitar ejecutar Docker dentro de Docker (también conocido como dind ), si es posible, si es posible. (La fuente se proporciona a continuación.) En su lugar, desea establecer una forma para que su contenedor principal produzca y se comunique con contenedores hermanos .
Jérôme Petazzoni , el autor de la función que hizo posible que Docker se ejecute dentro de un contenedor Docker, en realidad escribió una publicación de blog diciendo que no debía hacerlo . El caso de uso que describe coincide con el caso de uso exacto del OP de un contenedor Docker de CI que necesita ejecutar trabajos dentro de otros contenedores Docker.
Petazzoni enumera dos razones por las cuales dind es problemático:
- No coopera bien con los módulos de seguridad de Linux (LSM).
- Crea una falta de coincidencia en los sistemas de archivos que crea problemas para los contenedores creados dentro de los contenedores principales.
De esa publicación de blog, describe la siguiente alternativa,
[La] forma más simple es simplemente exponer el zócalo Docker a su contenedor CI, montándolo con la -v
bandera.
En pocas palabras, cuando inicie su contenedor CI (Jenkins u otro), en lugar de piratear algo junto con Docker-in-Docker, comience con:
docker run -v /var/run/docker.sock:/var/run/docker.sock ...
Ahora este contenedor tendrá acceso al zócalo Docker y, por lo tanto, podrá iniciar contenedores. Excepto que en lugar de iniciar contenedores "secundarios", comenzará contenedores "hermanos".