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 ladocker:dind
y ladocker: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 ventanadocker build
dentro de un trabajo ci? ladocker:latest
imagen (¡ dentro de la cual se ejecutará el trabajo !) incorpora el demonio de la ventana acoplable (y creo que ladocker-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 ladocker build
docker run
, la ejecución de ladocker build
docker run
ydocker run
. También contiene el demonio docker pero no se inicia como su punto de entrada. -
docker:dind
basa endocker: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.