GitLab runner会为每个作业拉取镜像。

19

我有一个使用docker作为执行器的GitLab runner。我的问题是,它为每个任务拉取我定义的镜像,这需要更长的时间来完成流水线

输入图像说明

我如何缓存镜像并为作业runner添加一个拉取策略?可以有人帮忙吗?

3个回答

16
默认情况下,Docker执行程序的拉取策略为“始终”。您可以使用“if-not-present”拉取策略来确保仅在本地不可用时才拉取。
阅读选项此处的文档以及策略如何工作此处

1
谢谢,.gitlab-ci.yml 文件中的语法应该长什么样子? - Jananath Banuka
pull_policy:if-not-present,该文档说明在yaml中放置它的位置。 - Tarun Khosla
1
老实说,我找不到在yaml文件中放置pull_policy的位置。他们没有提到在哪里。只是提到了imageservice,但没有说明如何正确地放置它。 - Jananath Banuka
在您的配置中使用它,例如 [runners.docker] pull_policy = "if-not-present" 。您可以在此处检查如何使用https://gitlab.com/gitlab-org/gitlab-runner/-/issues/1905(仅供如何使用我参考此链接) - Tarun Khosla
对于我的Docker设置,位于以下位置:/var/lib/docker/volumes/gitlab-runner-config/_data/,请更新[runners.docker]部分。 - D'Ante Barnes

13

检查一下是否可以使用最新的 GitLab 13.8 (2021年1月)解决问题。

为Docker执行器配置多个镜像拉取策略

当CI job从容器注册表检索容器镜像时,网络连接中断可能导致数小时的开发时间丢失,并对时限敏感的产品部署产生负面影响。

为了解决这个可靠性问题,GitLab Runner Docker执行器现在支持在GitLab Runner config.toml文件中定义的pull_policy配置中使用多个值。

您可以使用这些值或堆叠的镜像拉取策略来配置拉取策略的组合,并减轻网络中断所造成的影响。

例如,如果配置了pull_policy =[always, if-not-present],则拉取策略将始终拉取镜像。
但是,如果目标容器注册表不可用,则GitLab Runner Docker执行器将退而使用if-not-present策略,这意味着该管道作业将使用镜像的本地副本。

https://about.gitlab.com/images/13_8/runner-docker-pull-policy.png -- Configure multiple image pull policies for Docker executor

请参见文档问题


GitLab 15.2 (2022年7月) 新增:

在流水线配置中设置镜像拉取策略

您可以选择不同的拉取策略,用于GitLab Runner在CI/CD作业中下载Docker镜像。

  • always(默认行为)始终确保下载镜像,
  • if-not-present仅在本地没有版本时才下载镜像,和
  • never仅使用本地版本(从不下载镜像)。

以前,您只能在Runner级别定义拉取策略。在此版本中,我们已经添加了在流水线级别上定义拉取策略的功能。在.gitlab-ci.yml文件中使用pull_policy来定义作业或流水线级别的不同拉取策略。此功能不受共享Runner支持。

https://about.gitlab.com/images/15_2/pull_policy.png -- 在流水线配置中设置镜像拉取策略

请参见文档问题


为什么我明确指定了pull_policy: if-not-present,但GitLab仍然尝试拉取镜像并失败?有任何想法吗?我甚至尝试将其添加到config.toml文件中,但即使在所有尝试之后,它仍然显示相同的错误,就像默认的docker pull_policy: always一样。 - Ashish Pratap
@AshishPratap 不确定为什么:这将是一个很好的单独问题:请确保提到您使用的确切GitLab版本(您是使用本地部署的还是gitlab.com?) - VonC

4

而且令人惊讶的是,您不必循环服务以使更改生效! - Richard

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接