Gitlab CI多阶段构建后续任务Docker镜像过时如何解决?
问题原因
GitLab Runner 默认采用 if-not-present 镜像拉取策略,本地存在同标签镜像时就不会主动拉取远程仓库的最新版本。你用分支名作为镜像标签,分支多次构建后同标签镜像内容更新,Runner 就会用到本地缓存的旧镜像。
解决方法
方法1:单个任务配置强制拉取最新(推荐)
GitLab Runner 13.7 及以上版本支持在CI配置中直接指定镜像拉取策略,给需要用最新镜像的任务加上 pull_policy: always 即可,修改后的配置如下:
stages: - create_builder_image - test Create Builder Image: stage: create_builder_image script: - export DOCKER_BRANCH_TAG=$CI_COMMIT_REF_SLUG # 执行镜像构建相关操作,使用缓存提升构建速度 - docker push $GITLAB_IMAGE/builder:$DOCKER_BRANCH_TAG Run Tests: image: name: $GITLAB_IMAGE/builder:$CI_COMMIT_REF_SLUG pull_policy: always stage: test script: # 在第一阶段构建的镜像环境中执行相关操作
如果需要所有任务都强制拉取最新,可以把这段配置写到全局的 default 块里:
default: image: pull_policy: always
方法2:全局配置Runner拉取策略
如果要让所有使用该Runner的任务都强制拉取最新镜像,可以修改Runner所在节点的 config.toml 配置,在对应Executor的配置段添加:
pull_policy = "always"
额外优化建议
用分支名作为镜像标签本身有被覆盖的风险,更稳妥的方式是用本次提交的唯一哈希作为镜像标签:将标签替换为 $CI_COMMIT_SHORT_SHA,每次构建的镜像标签唯一,完全不会出现用错旧镜像的问题,同时还可以保留分支名标签给其他场景使用。
内容的提问来源于stack exchange,提问作者Marcus Ilgner
相关产品推荐
相关产品推荐

