我正在我的项目中使用GitLab CI,我创建了一个图像来进行测试和构建。当我在docker executor中运行它时,每个工作都需要从头开始下载映像。我需要缓存图层并提取图像以改善构建和部署时间(5分钟,使用不安全选项最多可达到1分钟)。
我搜索了多个链接和多个文章,许多人都遇到相同的问题。但是,GitLab团队无法解决问题。而且社区没有一个可靠的解决方案。以下链接带有相同的问题:
最可能的方法(带有层缓存)是使用一个单独的容器,使运行程序连接到它,并从中触发执行。这样,所有层将位于“无限生命”容器中,并且在阶段结束时不会丢失所有缓存。考虑将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
[当您使用kaniko
时可能会更好。当您使用dind
进行构建时,效果不好。 (danger note @ gitlab reference)
kaniko
提供了使用存储库中的缓存机制的机会。 kaniko@github
您唯一需要的是某个地方的存储库(我建议Artifactory)。使用Artifactory,您还可以通过dind
进行缓存(请参见here)。