yml name hub compose docker continuous-integration gitlab gitlab-ci

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:dind es la diferencia entre la docker:dind y la docker:latest imá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 build de la ventana docker build dentro de un trabajo ci? la docker:latest imagen (¡ dentro de la cual se ejecutará el trabajo !) incorpora el demonio de la ventana acoplable (y creo que la docker-compose también), que son las herramientas necesarias para los comandos que necesitamos (por ejemplo, docker build docker push , docker push etc)?

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:latest contiene todo lo necesario para conectarse a un demonio de la ventana acoplable, es decir, para ejecutar la docker build docker run , la ejecución de la docker build docker run y docker run . También contiene el demonio docker pero no se inicia como su punto de entrada.
  • docker:dind basa en docker:latest y 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.