Pregunta ¿Cómo puedo dejar que la imagen DinD del gitlab-ci-runner guarde imágenes intermedias?


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

Sin embargo, si presiono mi propia instalación de GitLab y se inicia el compilador GitLab-CI build, esto siempre parece comenzar desde cero, al volver a descargar el FROM imagen, y haciendo la instalación de apt-get nuevamente. Esto me parece una gran pérdida, así que estoy tratando de encontrar la forma de obtener la imagen DinD de GitLab para almacenar en caché las imágenes intermedias entre compilaciones, sin suerte hasta el momento.

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

¿Es esto incluso algo que se supone que puede hacer la imagen DinD de gitlab-runner?

Mi .gitlab-ci.yml:

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

Mi Dockerfile:

FROM php:5.6-fpm
MAINTAINER Roel Harbers <roel.harbers@example.com>
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.

Uso GitLab CE 8.4.0 y gitlab / gitlab-runner: último como corredor, iniciado como

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 se registra 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, todos con el mismo resultado: sin almacenamiento en caché en absoluto)


32
2018-02-22 14:51


origen


Respuestas:


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

Lo que podrías intentar es declarar /var/lib/docker como un volumen para su corredor GitLab. Pero ten en cuenta que, dependiendo de los controladores del sistema de archivos, puedes usar AUFS en el contenedor de un sistema de archivos AUFS en tu host, lo que es muy probable que cause problemas.

Lo que te sugiero es crear un separar Docker-VM, solo para el corredor (es), y bind-mount docker.sock desde la máquina virtual en su contenedor de corredor. Estamos utilizando esta configuración con GitLab con gran éxito (> 27.000 versiones en aproximadamente 12 meses).

Puedes echar un vistazo a nuestro corredor con docker-compose apoyo que en realidad se basa en el ejecutor de shell del corredor de GitLab.


13
2018-03-28 18:35



Actualmente no puede almacenar capas intermedias en GitLab Docker-in-Docker. A pesar de que hay planes para agregar eso (que se mencionan en el siguiente enlace). Lo que puedes hacer hoy para acelerar tu compilación DinD es usar el sistema de archivos superpuesto. Para hacer esto, debe ejecutar un kernel liunx> = 3.18 y asegúrese de cargar el módulo de kernel de superposición. Luego configuras esta variable en tu gitlab-ci.yml:

variables:
  DOCKER_DRIVER: overlay

Para obtener más información, consulte este tema y, en particular, este comentario sobre "El estado de optimización de Docker Builds!", Consulte la sección "Uso de docker executor with dind".

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


3
2017-08-29 21:26



Para las dependencias de compilación que no cambian con tanta frecuencia, puede hacer un poco de caché manual con el registro de imágenes de gitlab. En el script de CI no llama explícitamente docker build sino más bien envolverlo en un script de shell

# 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 su devbase.dockerfilese actualiza esto pasará desapercibido para CI, por lo que debe forzar la compilación y el empuje de una nueva imagen. Por lo tanto, para cambiar dinámicamente las imágenes, esto no funciona bien, pero para su caso de uso, esto parece una manera posible de hacerlo.


0
2018-06-27 09:33