我在Kubernetes集群上使用GitLab Runner来运行CI作业。我想使构建作业运行得更快。
为了使其更快,我重用了先前构建的Docker映像(标记为latest
)。构建时间减少了,但是现在瓶颈是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注册表以节省每次构建几分钟的时间?
是否可以将映像保存在群集中的某个位置,以免每次都不从注册表中提取?
答案 0 :(得分:0)
您可以在Docker守护程序内部运行专用pod,并将永久性卷安装到/ var / lib / docker。之后,您使用名为“ docker”的服务公开此Pod。之后,在CI作业中定义环境变量“ DOCKER_HOST = tcp:// docker”。
这样,您所有的构建和映像都将存储在运行在专用pod中的Docker守护程序中。您不会浪费时间提取图像,而且由于Docker构建缓存,构建运行得更快。
请记住要监视持久卷上的磁盘空间使用情况并定期触发“ docker system prune”。
答案 1 :(得分:0)
有几种方法可以更快地在Pipeline中构建Docker映像。
在这里,您必须将主机的/var/lib/docker.sock挂载到构建容器中。它很脆弱。但是还是太快了。
在这里您可以使用同时具有docker cli和daemon的dind映像。它不会与主机的docker守护进程通信。整个构建过程将在pod中进行。不是100%安全,而是更快。
这些是Daemoneless下一代映像构建工具,并且不依赖Docker守护程序。比DOOD和DIND更安全,也更快,并支持缓存。
答案 2 :(得分:0)
Gitlab共享跑步者没有您以前的图像(您注意到)。因此,您的选择要么像您所做的那样拉,要么与自己的跑步者一起去。上次查看时,您不能在gitlab kubernetes集成页面上安装kubernetes运行程序,因此我不得不部署自己的运行程序。
这里是一个部署,该部署创建4个运行程序(要做:找出自动缩放比例)并将其注册为postStart事件。您需要从您的项目/组(https://gitlab.com/[user]/[project]/settings/ci_cd)的“设置/共享”页面获取注册令牌。而且,您必须在同一页面上禁用共享跑步者。
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