Gitlab CI:如何避免每次提交时重建图像

Gitlab CI:如何避免每次提交时重建图像,gitlab,gitlab-ci,gitlab-ci-runner,docker-build,Gitlab,Gitlab Ci,Gitlab Ci Runner,Docker Build,我正在使用Gitlab CI存储和部署docker映像,但我遇到了一个大问题。Gitlab CI正在每次提交时重建所有映像 第一步是建立我的共同形象,大约需要8分钟。目前我只修改子映像,但每次提交时仍会重建公共映像 因此,构建是浪费时间的,因为推送不会产生效果,因为映像已经在Gitlab存储库中 当图像已经在Gitlab存储库中时,如何避免重建图像 下面是gitlab-ci.yml build: tags: - docker_ci_build services:

我正在使用Gitlab CI存储和部署docker映像,但我遇到了一个大问题。Gitlab CI正在每次提交时重建所有映像

第一步是建立我的共同形象,大约需要8分钟。目前我只修改子映像,但每次提交时仍会重建公共映像

因此,构建是浪费时间的,因为推送不会产生效果,因为映像已经在Gitlab存储库中

当图像已经在Gitlab存储库中时,如何避免重建图像

下面是gitlab-ci.yml

build:
   tags:
       - docker_ci_build
   services:
       - docker:dind
   script:
       - docker login -u gitlab-ci-token -p $CI_JOB_TOKEN $CI_REGISTRY
       - >
           docker build 
           -t $CI_PROJECT/common:6.0.1 common
在dockerfile下面:

FROM ubuntu:bionic
RUN apt-get update && \
     DEBIAN_FRONTEND=noninteractive \
     apt-get install -y packages && \
     apt-get clean && \
     rm -rf /var/lib/apt/lists/*
COPY file.conf /etc/common/

缓存似乎比我最初想象的要复杂,docker文档中关于各种pull选项的描述没有提到任何细微差别

如果docker映像可能存在,也可能不存在,您可以实际调整docker pull命令以通过构建,即使pull失败:

- docker image pull $LATEST || true
如果存在镜像$LATEST,则会将其拉入,否则将继续您的构建。下一步是确保您的构建可以实际使用它

docker build的
--pull
选项似乎是您想要的,docker的文档中说

--pull始终尝试提取较新版本的图像

但它似乎对你正在构建的实际图像没有任何作用。更有希望的是
--cache from
,它允许您命名docker可以从中缓存的图像。然而,在我的简单测试中,我没有看到docker实际使用我的缓存,可能是因为docker映像中没有足够的层来利用缓存

- docker image pull $LATEST_IMAGE || true
- docker build --pull -t $TAGGED_IMAGE --cache-from $LATEST_IMAGE .
- docker tag $TAGGED_IMAGE $LATEST_IMAGE
- docker push $LATEST_IMAGE
- docker push $TAGGED_IMAGE
如果您的构建映像是构建的,并且实际上可以利用缓存,那么这可能会更有用。或者,您可以调整gitlab ci脚本,以避免在映像存在时生成

或者,您可能希望查看gitlab ci管道,并在构建和推送公共项目以及构建子项目时创建可选的阶段和触发器

我在文件开头的
variables
部分定义变量
使用
:Latest
标记定义Latest,该标记基本上是项目任何CI分支的最新版本
$taged_IMAGE
是用
定义的:$CI_COMMIT_SHORT_SHA
用git SHA标记docker映像,这使得kubernetes部署到开发环境更容易跟踪

这个问题不可能在没有看到代表
.gitlab ci.yml
Dockerfile
的情况下回答。我编辑了第一篇文章。但我做了新的搜索,这似乎是不可能的。唯一的方法是在构建之前从注册表中提取映像。但是如果映像还不存在,它会使您的构建失败。
docker build--pull
不工作。我在每个提交上都有一个完整的构建,没有任何更改。作为gitlab的一部分,您是否正在从您的私有docker注册表中推拉?我不记得在gitlab的CI变量列表中定义了
$CI_PROJECT
:我在gitlab注册表中推/拉CI_PROJECT是我的gitlab_CI开头的自定义变量。yml等于CI_PROJECT_URL,没有https://.I'如果添加了更多信息,您可以尝试
docker image pull$NAME | | true
。您的构建是否真的利用了图像缓存,或者您是否仅尝试在图像不存在时构建图像?是的,它可以工作。|如果映像不存在,则true允许继续作业。在build命令中--cache from是必需的。谢谢