我正在使用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/
最诚挚的问候
答案 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部署到开发环境的部署更容易跟踪。