¿Cómo puedo dejar que la imagen DIND de gitlab-ci-runner almacene imágenes intermedias?


Tengo un Dockerfile que comienza con la instalación del paquete texlive-full, que es enorme y lleva mucho tiempo. Si lo docker build localmente, la imagen intermedada creada después de la instalación se almacena en caché, y las compilaciones posteriores son rápidas.

Sin embargo, si envio a mi propia instalación de GitLab y se inicia el runner de compilación de GitLab-CI, esto siempre parece comenzar desde cero, volviendo a descargar la imagen FROM y haciendo la instalación de apt-get de nuevo. Esto me parece un gran desperdicio, así que estoy tratando de averigua cómo hacer que la imagen de GitLab DinD almacene en caché las imágenes intermedias entre compilaciones, sin suerte hasta ahora.

He intentado usar el --cache-dir y --docker-cache-dir para el comando gitlab-runner register, en vano.

¿Es esto algo que se supone que la imagen dind de gitlab-runner pueda hacer?

Mi .gitlab-ci.yml:

build_job:
    script:
    - docker build --tag=example/foo .

Mi Dockerfile:

FROM php:5.6-fpm
MAINTAINER Roel Harbers <[email protected]>
RUN apt-get update && apt-get install -qq -y --fix-missing --no-install-recommends texlive-full
RUN echo Do other stuff that has to be done every build.

Utilizo GitLab CE 8.4.0 y gitlab / gitlab-runner: latest as runner, iniciado como{[17]]}

docker run -d --name gitlab-runner --restart always \
    -v /var/run/docker.sock:/var/run/docker.sock \
    -v /usr/local/gitlab-ci-runner/config:/etc/gitlab-runner \
    gitlab/gitlab-runner:latest \
; \

El corredor está registrado usando:

docker exec -it gitlab-runner gitlab-runner register \
    --name foo.example.com \
    --url https://gitlab.example.com/ci \
    --cache-dir /cache/build/ \
    --executor docker \
    --docker-image gitlab/dind:latest \
    --docker-privileged \
    --docker-disable-cache false \
    --docker-cache-dir /cache/docker/ \
; \

Esto crea lo siguiente config.toml:

concurrent = 1
[[runners]]
    name = "foo.example.com"
    url = "https://gitlab.example.com/ci"
    token = "foobarsldkflkdsjfkldsj"
    tls-ca-file = ""
    executor = "docker"
    cache_dir = "/cache/build/"
    [runners.docker]
        image = "gitlab/dind:latest"
        privileged = true
        disable_cache = false
        volumes = ["/cache"]
        cache_dir = "/cache/docker/"

(He experimentado con diferentes valores para cache_dir, docker_cache_dir y disable_cache, todo con el mismo resultado: sin almacenamiento en caché en absoluto)

Author: Roel Harbers, 2016-02-22

3 answers

Supongo que no hay una respuesta simple a su pregunta. Antes de añadir algunos detalles, recomiendo encarecidamente leer este artículo de blog del mantenedor de DinD, que originalmente se llamaba "no usar Docker en Docker para CI".

Lo que podrías intentar es declarar /var/lib/docker como un volumen para tu GitLab runner. Pero tenga cuidado, dependiendo de los controladores de su sistema de archivos, puede usar AUFS en el contenedor en un sistema de archivos AUFS en su host, lo que es muy probable que cause problema.

Lo que le sugeriría es crear un separado Docker-VM, solo para el runner(s), y bind-mount docker.sock desde la VM en su runner-container. Estamos usando esta configuración con GitLab con gran éxito (>27.000 compilaciones en aproximadamente 12 meses).

Puedes echar un vistazo a nuestro runner con soporte docker-compose que en realidad está basado en el ejecutor-shell del runner de GitLab.

 13
Author: schmunk,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2016-03-28 18:35:36

Actualmente no puede almacenar en caché capas intermedias en GitLab Docker-in-Docker. Aunque hay planes para agregar eso (que se mencionan en el enlace de abajo). Lo que puede hacer hoy para acelerar su compilación DinD es usar el sistema de archivos overlay. Para hacer esto, debe ejecutar un kernel liunx >=3.18 y asegurarse de cargar el módulo de kernel superpuesto. Luego establece esta variable en su gitlab-ci.yml:

variables:
  DOCKER_DRIVER: overlay

Para más información ver este número y en particular este comentario sobre " El estado de optimizar las compilaciones de Docker!", vea la sección "Usando docker executor con dind".

Https://gitlab.com/gitlab-org/gitlab-ce/issues/17861#note_12991518

 3
Author: Jonas Kello,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2016-08-29 21:26:37

Para construir dependencias que no cambian por lo que ofter puede hacer un poco de caché manual con gitlab image registry. En CI script no se llama explícitamente docker build sino que se envuelve en un shell script

# cat build_dependencies.sh
registry=registry.example.com
project=group/project
imagebase=$registry/$project/linux

docker pull $imagebase/devbase:1.0
if [ $? -ne 0 ]; then
   docker build -f devbase.dockerfile -t $imagebase/devbase:1.0 .
   docker push $imagebase/devbase:1.0
fi
...

Y llame a ese script en su CI

  ...
  script:
    - ./build_dependencies.sh

La desventaja de esto es que cuando se actualiza su devbase.dockerfile esto pasaría desapercibido para CI, por lo que necesita forzar la compilación y el empuje de una nueva imagen. Así que para cambiar imágenes de forma dinámica esto no funciona bien, pero para su caso de uso esto parece un posible camino a seguir.

 0
Author: Slava,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2018-06-27 09:33:11