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