Я работаю над GitLab CI в своем проекте, и я создал образ для тестирования и сборки. Когда я запускал его в Docker Executor, каждая работа должна загружать изображения с самого начала. Мне нужно кэшировать слои и извлекаемые изображения, чтобы улучшить время сборки и развертывания (5 минут, до 1 минуты с небезопасной опцией).
Я искал несколько ссылок и несколько статей, и многие люди с одинаковымипроблема. Но команда GitLab не решает проблему. И у сообщества нет твердого и безопасного решения. Ссылки ниже приводят с той же проблемой:
- Лучший ответ не работает: Сохранение слоев в gitlab ci docker executor
- Несколько изменений, чтобы обойтипроблема, но ничего не работает: https://blog.scottlogic.com/2018/02/09/multi-dind-ci-boxes.html
- Обсуждение для использования не подключен docker.sock : https://gitlab.com/gitlab-org/gitlab-foss/issues/17769
- Обсуждение для использования подключен Докер. sock : https://jpetazzo.github.io/2015/09/03/do-not-use-docker-in-docker-for-ci/
- Сборка контейнера долгое время (не работайте со мной): https://medium.com/@tonywooster/docker-in-docker-in-gitlab-runners-220caeb708ca
- Документация для не смонтированных docker.sock: https://docs.gitlab.com/ce/ci/docker/using_docker_build.html#use-docker-in-docker-executor
- Примеры конфигурации томов: 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