Comment puis-je laisser le gitlab-ci-coureur de Retrouver l'image du cache des images intermédiaires?

j'ai un fichier Dockerfile qui commence avec l'installation du paquet texlive-full, qui est énorme et prend beaucoup de temps. If I docker build localement, l'image entrelacée créée après l'installation est mise en cache, et les compilations suivantes sont rapides.

cependant, si je pousse vers ma propre installation GitLab et que la construction GitLab-CI runner commence, cela semble toujours commencer à partir de zéro, en rechargeant le FROM image, et faire l'installation apt-get à nouveau. Cela semble être un gaspillage énorme pour moi, donc je suis essayer de trouver comment obtenir L'image GitLab DinD pour mettre en cache les images intermédiaires entre les compilations, sans succès jusqu'à présent.

j'ai essayé d'utiliser le --cache-dir et --docker-cache-dir pour les gitlab-runner register commande, en vain.

est - ce même quelque chose que le gitlab-runner DinD image est censé être capable de faire?

Mon .gitlab-ci.yml:

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

Mon 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.

J'utilise GitLab CE 8.4.0 et gitlab / gitlab-runner: dernier comme runner, a commencé comme

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 
; 

Le coureur est enregistrée à l'aide de:

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/ 
; 

cela crée les 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/"

(j'ai expérimenté différentes valeurs pour cache_dir,docker_cache_dir et disable_cache, tous avec le même résultat: pas de mise en cache que ce soit)

33
demandé sur Roel Harbers 2016-02-22 17:51:09

3 réponses

je suppose qu'il n'y a pas de réponse simple à votre question. Avant d'ajouter quelques détails, je suggère fortement de lire cet article de blog du responsable de DinD, qui s'appelait à l'origine "n'utilisez pas Docker dans Docker pour CI".

ce que vous pourriez essayer est de déclarer /var/lib/docker comme un volume pour votre coureur GitLab. Mais attention, selon les pilotes de votre système de fichiers, vous pouvez utiliser AUFS dans le conteneur sur un système de fichiers AUFS sur votre hôte, ce qui est très susceptible de causer problème.

ce que je vous suggère c'est de créer un distinct menu fixe-VM, seulement pour le coureur(s), et liez-mont docker.sock de la VM à votre runner-container. Nous utilisons cette configuration avec GitLab avec beaucoup de succès (>27.000 constructions en 12 mois environ).

vous pouvez jeter un oeil à notre runner docker-compose soutien qui est en fait basé sur le shell-exécuteur du runner de GitLab.

13
répondu schmunk 2016-03-28 18:35:36

Actuellement, vous ne pouvez pas mettre en cache les couches intermédiaires dans GitLab Docker-in-Docker. Bien qu'il y ait des plans pour ajouter cela (qui sont mentionnés dans le lien ci-dessous). Ce que vous pouvez faire aujourd'hui pour accélérer votre construction DinD est d'utiliser le système de fichiers de superposition. Pour ce faire, vous devez exécuter un noyau liunx >=3.18 et vous assurer de charger le module du noyau de superposition. Ensuite, vous définissez cette variable dans votre gitlab-ci.yml:

variables:
  DOCKER_DRIVER: overlay

Pour plus d'informations, consultez cette question et, en particulier ce commentaire "L'état d'optimisation des constructions Docker!", voir "Utilisation de docker exécuteur testamentaire avec nid".

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

3
répondu Jonas Kello 2016-08-29 21:26:37

pour les dépendances de construction qui ne changent pas, vous pouvez faire un peu de cache manuel avec gitlab image registry. Dans le script CI vous n'appelez pas explicitement docker build mais plutôt l'envelopper dans un script 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
...

et l'appel de ce script dans votre CI

  ...
  script:
    - ./build_dependencies.sh

L'inconvénient de cette est que lorsque votre devbase.dockerfile est mis à jour cela passerait inaperçu par CI, donc vous devez forcer la construction et la poussée d'une nouvelle image. Donc pour changer dynamiquement les images cela ne fonctionne pas bien, mais pour votre cas d'utilisation, cela semble être une manière d'aller.

0
répondu Slava 2018-06-27 09:33:11