gitlab ci如何不重建图像

时间:2019-03-20 10:36:13

标签: gitlab gitlab-ci gitlab-ci-runner docker-build

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

第一步是构建我的通用图像,大约需要8分钟。目前,我仅修改子图像,但是每次提交时都会重建公​​共图像...

因此构建非常无用,因为推送不会做任何事情:图像已经在gitlab存储库中。

当图像已经在gi实验室存储库中时,如何不重建图像?

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/

最诚挚的问候

1 个答案:

答案 0 :(得分:0)

缓存似乎比我最初想象的要复杂,有关各种拉取选项的docker文档没有提及任何细微差别。

如果docker映像可能存在或不存在,即使拉取失败,您实际上也可以调整docker 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

如果您的构建映像是multi-stage构建版本,并且实际上可以利用缓存,则此功能可能更为有用。 (可选)您可以调整gitlab-ci脚本,以避免在图像存在时进行构建。

(可选)您可能希望查看gitlab-ci管道,并为构建和推送common以及何时构建子项目创建可选的阶段和触发器。

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