Jak mogę pozwolić, aby gitlab-ci-runner DinD image cache intermediate images?

Mam plik Dockerfile, który zaczyna się od zainstalowania pakietu texlive-full, który jest ogromny i zajmuje dużo czasu. Jeśli i docker build to lokalnie, obraz intermedate utworzony po instalacji jest buforowany, a kolejne Kompilacje są szybkie.

Jednakże, jeśli nacisnę na moją własną instalację GitLab i uruchomi się runner GitLab-CI build, to zawsze wydaje się to zaczynać od zera, ładując ponownie obraz FROM i wykonując apt-get install ponownie. Wydaje mi się to wielką stratą, więc staram się dowiedz się, jak sprawić, by obraz GitLab DinD buforował obrazy pośrednie między kompilacjami, bez powodzenia.

Próbowałem użyć --cache-dir i --docker-cache-dir do polecenia gitlab-runner register, bez skutku.

Czy to w ogóle jest coś, co powinien robić Obraz Dinda z gitlab-runner?

Mój .gitlab-ci.yml:

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

Mój 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.

Używam GitLab CE 8.4.0 i gitlab / gitlab-runner: latest jako runner, started jako

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

Biegacz jest zarejestrowany użycie:

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

Tworzy to następujący 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/"

(eksperymentowałem z różnymi wartościami dla cache_dir, docker_cache_dir i disable_cache, wszystkie z tym samym wynikiem: bez buforowania w ogóle)

Author: Roel Harbers, 2016-02-22

3 answers

Przypuszczam, że nie ma prostej odpowiedzi na twoje pytanie. Przed dodaniem niektórych szczegółów, zdecydowanie polecam przeczytać Ten artykuł na blogu od opiekuna DinD, który pierwotnie nosił nazwę "Docker in Docker for CI".

Możesz spróbować zadeklarować /var/lib/docker jako wolumin dla Twojego GitLab runnera. Ale ostrzegam, w zależności od sterowników systemu plików możesz użyć aufs w kontenerze na systemie plików AUFS na swoim komputerze, co jest bardzo prawdopodobne, że spowoduje problemy.

Sugerowałbym utworzenie oddzielnego Docker-VM, tylko dla runner(s) i bind-mount docker.sock z maszyny Wirtualnej do kontenera runner. Korzystamy z tej konfiguracji z GitLab z wielkim sukcesem (>27.000 kompilacji w około 12 miesięcy).

Możesz spojrzeć na nasz runner z docker-compose wsparciem , który w rzeczywistości jest oparty na shell-executorze Runnera 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/doraprojects.net/template/agent.layouts/content.php on line 54
2016-03-28 18:35:36

Obecnie nie można buforować warstw pośrednich w GitLab Docker-in-Docker. Oprócz tego są plany, aby dodać, że (które są wymienione w linku poniżej). To, co możesz zrobić dzisiaj, aby przyspieszyć kompilację DinD, to użyć nakładkowego systemu plików. Aby to zrobić, musisz uruchomić jądro liunx > = 3.18 i upewnić się, że załadowałeś moduł jądra nakładki. Następnie ustawiasz tę zmienną w gitlab-ci.yml:

variables:
  DOCKER_DRIVER: overlay

Więcej informacji można znaleźć w tym numerze, a w szczególności w komentarzu do " Państwa optymalizacji budów Dockera!", patrz sekcja "Korzystanie z Docker executor with 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/doraprojects.net/template/agent.layouts/content.php on line 54
2016-08-29 21:26:37

Dla zależności budowania, które nie zmieniają się tak często, można zrobić rodzaj ręcznego buforowania z gitlab image registry. W skrypcie CI nie wywołujesz docker build, ale raczej zawijasz go w skrypt powłoki

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

I wywołaj ten skrypt w swoim CI

  ...
  script:
    - ./build_dependencies.sh

Minusem tego jest to, że po zaktualizowaniu devbase.dockerfile zostanie to niezauważone przez CI, więc musisz wymusić zbudowanie i wypchnięcie nowego obrazu. Tak więc dla dynamicznie zmieniających się obrazów to nie działa dobrze, ale dla Twojego przypadku użycia to wygląda na to, że to możliwe.

 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/doraprojects.net/template/agent.layouts/content.php on line 54
2018-06-27 09:33:11