如何在CI构建期间减少docker拉动时间?
我在Kubernetes集群上使用GitLab Runner来运行CI作业。我想让构建作业运行得更快 为了使它们更快,我重用了以前构建的Docker映像(标记为如何在CI构建期间减少docker拉动时间?,docker,kubernetes,gitlab-ci,gitlab-ci-runner,Docker,Kubernetes,Gitlab Ci,Gitlab Ci Runner,我在Kubernetes集群上使用GitLab Runner来运行CI作业。我想让构建作业运行得更快 为了使它们更快,我重用了以前构建的Docker映像(标记为最新版本)。构建时间减少了,但现在的瓶颈是pull命令,它占用了大约60-70%的时间 下面是.gitlab ci.yml的片段: build:sheets: stage: build image: docker:stable services: - docker:dind before_script: -
最新版本
)。构建时间减少了,但现在的瓶颈是pull
命令,它占用了大约60-70%的时间
下面是.gitlab ci.yml
的片段:
build:sheets:
stage: build
image: docker:stable
services:
- docker:dind
before_script:
- echo "$CI_REGISTRY_PASSWORD" | docker login -u "$CI_REGISTRY_USER" "$CI_REGISTRY" --password-stdin
script:
- docker pull $SHEETS_LATEST || true
- docker build --cache-from $SHEETS_LATEST --tag $SHEETS_TAG --tag $SHEETS_LATEST .
- docker push $SHEETS_TAG
- docker push $SHEETS_LATEST
我使用Gitlab注册表,因此pull
命令需要集群和注册表之间进行大量通信
所以我这里有几个问题:
您可以运行内部带有Docker守护进程的专用pod,并将永久卷装入/var/lib/Docker。之后,您将使用名为“docker”的服务公开此pod。然后在CI作业中定义环境变量“DOCKER\u HOST”=tcp://docker“ 这样,所有构建和映像都存储在Docker守护进程中,运行在专用的pod中。由于Docker build cache,您不会浪费时间拉取图像,而且构建运行得更快
请记住监视持久卷上的磁盘空间使用情况,并定期触发“docker system prune”。有几种方法可以更快地在管道中构建docker映像
这些是无后台程序的下一代映像构建工具,不依赖于Docker后台程序。比DOOD和DIND更安全,速度更快,支持缓存 Gitlab共享跑步者没有您以前的图像可用(如您所注意到的)。所以你的选择要么像你现在做的那样拉它,要么和你自己的跑步者一起跑。上次我查看时,您无法在gitlab kubernetes集成页面上安装kubernetes runner,因此我必须部署自己的runner 下面是一个创建4个运行程序(todo:figure out autoscaling)并将其注册为启动后事件的部署。您需要从项目或组的设置/cicd页面获取注册令牌()。您必须禁用同一页面中的共享跑步者
kind: Deployment
metadata:
name: gitlabrunner
labels:
app: gitlabrunner
spec:
replicas: 4
selector:
matchLabels:
app: gitlabrunner
template:
metadata:
labels:
app: gitlabrunner
name: gitlabrunner
spec:
containers:
- name: gitlabrunner
image: gitlab/gitlab-runner
volumeMounts:
- name: dockersock
mountPath: "/var/run/docker.sock"
lifecycle:
postStart:
exec:
command: ["/bin/sh", "-c", "gitlab-runner register -n --url https://gitlab.com/ --registration-token [YOUR_REGISTRATION_TOKEN] --executor docker --description 'My Docker Runner' --docker-image 'docker:stable' --docker-volumes /var/run/docker.sock:/var/run/docker.sock"]
volumes:
- name: dockersock
hostPath:
path: /var/run/docker.sock
谢谢你的回答,但是你能解释一下如何在GitLab Runner中启动这样一个pod吗?谢谢你的概述,但这并不能解释如何在GitLab CI中使用它。我不使用GitLab共享Runner。我已经用头盔将它们部署到我的集群中。问题是如何在集群内保存图像,这样我就可以避免与注册表的额外通信。