name - gitlab runner docker
Función del servicio docker-in-docker(dind) en gitlab ci (2)
De acuerdo con la documentación oficial de gitlab , una forma de habilitar la docker build dentro de las tuberías de ci , es hacer uso del servicio dind (en términos de gitlab-ci de gitlab-ci ).
Sin embargo, como siempre es el caso de los trabajos ci que se ejecutan en ejecutores de docker, el docker:latest también se necesita la docker:latest imagen.
¿Podría alguien explicar:
- ¿
docker:dindes la diferencia entre ladocker:dindy ladocker:latestimágenes? - (lo más importante): ¿por qué se necesita tanto el servicio como la imagen de la ventana acoplable (por ejemplo, como se indica en este ejemplo , vinculado a la documentación de github) para realizar, por ejemplo, una
docker buildde la ventanadocker builddentro de un trabajo ci? ladocker:latestimagen (¡ dentro de la cual se ejecutará el trabajo !) incorpora el demonio de la ventana acoplable (y creo que ladocker-composetambién), que son las herramientas necesarias para los comandos que necesitamos (por ejemplo,docker builddocker push,docker pushetc)?
A menos que esté equivocado, la pregunta más o menos se convierte en:
Por qué un cliente de ventana acoplable y un demonio de ventana acoplable no pueden residir en el mismo contenedor (habilitado) de la ventana acoplable
¿Cuál es la diferencia entre la ventana acoplable: dind y la ventana acoplable: las últimas imágenes?
-
docker:latestcontiene todo lo necesario para conectarse a un demonio de la ventana acoplable, es decir, para ejecutar ladocker builddocker run, la ejecución de ladocker builddocker runydocker run. También contiene el demonio docker pero no se inicia como su punto de entrada. -
docker:dindbasa endocker:latesty comienza un demonio docker como su punto de entrada.
Por lo tanto, su contenido es casi el mismo, pero a través de sus puntos de entrada, uno está configurado para conectarse a tcp://docker:2375 como cliente, mientras que el otro debe usarse para un demonio.
¿Por qué se necesita tanto el servicio como la imagen de la ventana acoplable [...]?
No necesitas los dos. Puedes usar cualquiera de los dos, iniciar dockerd como primer paso y luego ejecutar los comandos de docker build y docker run como de costumbre, como lo hice here ; Al parecer este fue el enfoque original en gitlab en algún momento . Pero me parece más limpio escribir solo service: docker:dind lugar de tener un before_script para configurar el dockerd . Además, no tiene que descubrir cómo iniciar e instalar el dockerd correctamente en su imagen base (si no está utilizando la docker:latest ).
Declarar el servicio en su .gitlab-ci.yml también le permite intercambiar fácilmente la .gitlab-ci.yml en la .gitlab-ci.yml acoplable si sabe que su corredor está montando su /var/run/docker.sock en su imagen. Puede establecer la variable protegida DOCKER_HOST en unix:///var/run/docker.sock para obtener construcciones más rápidas. Otros usuarios que no tienen acceso a un corredor de este tipo aún pueden bifurcar su repositorio y recurrir al servicio dind sin modificar su .giltab-ci.yml .
El contenedor contendrá solo las cosas definidas en una imagen docker. Usted sabe que puede instalar cualquier cosa, a partir de una imagen base. Pero también puede instalar Docker (deamon y cliente) en un contenedor, es decir, un Docker IN Docker (dind). Así que el contenedor podrá correr otros contenedores. Es por eso que gitlab necesita esto.