Слои кэша в GitLab Runner Docker Executor - Долгое время DinD-контейнер - PullRequest
2 голосов
/ 07 ноября 2019

Я работаю над GitLab CI в своем проекте, и я создал образ для тестирования и сборки. Когда я запускал его в Docker Executor, каждая работа должна загружать изображения с самого начала. Мне нужно кэшировать слои и извлекаемые изображения, чтобы улучшить время сборки и развертывания (5 минут, до 1 минуты с небезопасной опцией).

Я искал несколько ссылок и несколько статей, и многие люди с одинаковымипроблема. Но команда GitLab не решает проблему. И у сообщества нет твердого и безопасного решения. Ссылки ниже приводят с той же проблемой:

  1. Лучший ответ не работает: Сохранение слоев в gitlab ci docker executor
  2. Несколько изменений, чтобы обойтипроблема, но ничего не работает: https://blog.scottlogic.com/2018/02/09/multi-dind-ci-boxes.html
  3. Обсуждение для использования не подключен docker.sock : https://gitlab.com/gitlab-org/gitlab-foss/issues/17769
  4. Обсуждение для использования подключен Докер. sock : https://jpetazzo.github.io/2015/09/03/do-not-use-docker-in-docker-for-ci/
  5. Сборка контейнера долгое время (не работайте со мной): https://medium.com/@tonywooster/docker-in-docker-in-gitlab-runners-220caeb708ca
  6. Документация для не смонтированных docker.sock: https://docs.gitlab.com/ce/ci/docker/using_docker_build.html#use-docker-in-docker-executor
  7. Примеры конфигурации томов: https://github.com/ayufan/gitlab-ci-multi-runner/blob/master/docs/configuration/advanced-configuration.md#the-runnersdocker-section

Наиболее вероятный подход (с кэшированием слоя) состоит в использовании отдельного контейнера и подключении бегуна кэто, и инициировать выполнение от него. Таким образом, все слои будут находиться в контейнере с «бесконечной жизнью» и не потеряют весь кэш в конце этапа. Подход, предусматривающий выставление docker.sock в качестве монтирования, не только небезопасен, но также имеет много проблем с совместным использованием файлов между контейнерами, поскольку все они являются братьями и сестрами, а не родителями и детьми, которые совместно используют тома.

Подход к использованию контейнера с бесконечным ресурсом будет выглядеть примерно так:

docker run --privileged --name gitlab-dind -d --restart=always  docker:19-dind --storage-driver=overlay2

или

docker network create gitlab-runner-net

docker run --privileged --name gitlab-runner-dind --network gitlab-runner-net --publish=2375:2375 --publish=2376:2376 -d docker:19-dind --storage-driver=overlay2

Затем измените config.toml следующим образом:

[runners.docker]
  tls_verify = false
  image = "docker:19"   <--------
  privileged = false     <--------
  disable_cache = false
  volumes = ["/cache"]
  links = ["gitlab-runner-dind:docker"]   <-----------
  shm_size = 0
[runners.cache]

или соответственно

[runners.docker]
  host = "tcp://gitlab-runner-dind:2375"    <--------
  tls_verify = false
  image = "docker:19"   <--------
  privileged = true     <--------
  disable_cache = false
  volumes = ["/cache"]
  network_mode = "gitlab-runner-net"   <-----------
  shm_size = 0
[runners.cache]

Я тоже пробовал с переменной среды (на config.toml и .gitlab-ci.yml ):

DOCKER_TLS_CERTDIR=""
DOCKER_HOST=tcp://gitlab-runner-dind:2375

И удалить из .gitlab-ci.yml :

services:
  - docker:19-dind
  alias: docker

Мой текущий результат:

Running with gitlab-runner 12.4.1 (HASH)
  on NAME_OF_MY_RUNNER HASH
ERROR: Preparation failed: error during connect: Get http://gitlab-runner-dind:2375/v1.25/info: dial tcp: lookup gitlab-runner-dind on 172.31.0.2:53: no such host (executor_docker.go:980:0s)
Will be retried in 3s ...
ERROR: Preparation failed: error during connect: Get http://gitlab-runner-dind:2375/v1.25/info: dial tcp: lookup gitlab-runner-dind on 172.31.0.2:53: no such host (executor_docker.go:980:0s)
Will be retried in 3s ...
ERROR: Preparation failed: error during connect: Get http://gitlab-runner-dind:2375/v1.25/info: dial tcp: lookup gitlab-runner-dind on 172.31.0.2:53: no such host (executor_docker.go:980:0s)
Will be retried in 3s ...
ERROR: Job failed (system failure): error during connect: Get http://gitlab-runner-dind:2375/v1.25/info: dial tcp: lookup gitlab-runner-dind on 172.31.0.2:53: no such host (executor_docker.go:980:0s)

Использование смонтированного docker.sock работает. Но это небезопасно, и у томов много проблем с совместным использованием файлов, артефактов и кэша.

root@GitlabRunner:/etc/gitlab-runner# gitlab-runner --version
Version:      12.4.1
Git revision: 05161b14
Git branch:   12-4-stable
GO version:   go1.10.8
Built:        2019-10-28T12:49:57+0000
OS/Arch:      linux/amd64

1 Ответ

0 голосов
/ 15 ноября 2019

Может быть, лучше, когда вы используете kaniko. Это не хорошо, когда вы строите с dind. ( примечание об опасности @ ссылка на gitlab )

kaniko предлагает возможность использовать механизм кэширования из хранилища. kaniko @ github

Единственное, что вам нужно, это где-нибудь хранилище (я рекомендую Artifactory ). С Artifactory вы также можете кэшировать через dind (см. здесь ).

...