docker - Gitlab docker executor - 在 before_script 之后缓存图像

标签 docker gitlab gitlab-ci gitlab-ci-runner

gitlab-ci 中有一个选项 .gitlab-ci.yml在任何实际脚本运行之前执行命令的文件,称为 before_script.gitlab-ci.yml 示例说明了在此处安装辅助程序。但是,我注意到的是,当使用 docker 执行器时,这些更改不会缓存在 Docker 中。我天真地假设在运行这些命令之后,docker 会缓存图像,因此在下一次运行或测试时,docker 只会加载 before_script 之后生成的缓存图像。这将大大加快构建速度。

举个例子,我的 .gitlab-ci.yml 有点像:

image: ubuntu

before_script:
    - apt-get update -qq && apt-get install -yqq make ...

build:
    script:
        - cd project && make

一种可能的解决方案是转到运行器机器并创建一个 docker 镜像,该镜像可以构建我的软件而无需任何其他安装,然后在 yaml 文件的 image 部分中引用它。这样做的缺点是,每当我想添加依赖项时,我都需要登录到运行器机器并在构建成功之前更新镜像。如果我只需将依赖项添加到 apt-get install 的末尾并让 docker/gitlab-ci 处理适当的缓存,那就更好了。

.gitlab-ci.yml中还有一个cache命令,我试过设置成untracked: true,我以为会缓存所有不是我项目副产品的东西,但它似乎没有任何效果。

有什么方法可以得到我想要的行为吗?

最佳答案

您可以首先添加一个阶段来构建图像。如果图像没有任何变化,这个阶段会很短,不到 1 秒。

您可以在以下阶段使用该图像,加快整个过程。

这是一个.gitlab-ci.yml的例子:

stages:
  - build_test_image
  - test

build_test:
  stage: build_test_image
  script:
    - docker login -u gitlab-ci-token -p $CI_BUILD_TOKEN $CI_REGISTRY
    - docker build -t $CI_REGISTRY_IMAGE:test -f dockerfiles/test/Dockerfile .
    - docker push $CI_REGISTRY_IMAGE:test
  tags:
    - docker_build

test_syntax:
  image: $CI_REGISTRY_IMAGE:test
  stage: test
  script:
    - pip install flake8
    - flake8 --ignore=E501,E265 app/

查看标签 docker_build。该标签用于强制在具有该标签的运行器上执行阶段。该运行器的执行器是 shell,它仅用于构建 Docker 镜像。所以,runner 所在的主机应该已经安装了 Docker Engine。我发现这个解决方案比 docker in docker 和 another solutions 更适合我的需求。 .

另外,我使用的是私有(private)注册表,这就是我使用 $CI_REGISTRY* 变量的原因,但您可以使用 DockerHub 而无需指定注册表。不过,问题在于在 DockerHub 上进行身份验证。

关于docker - Gitlab docker executor - 在 before_script 之后缓存图像,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34820755/

相关文章:

java - maven 部署期间自动生成 GnuPG key 不会导出 key

docker - 发布 “docker run”命令

docker - 自动化docker commit和push

Mongodb 在内存不足时终止

docker - Jenkins 声明式管道 - 将 Docker 镜像推送到私有(private) docker hub 存储库

bash - 如何根据控制台输出中的文本使 GitLab 的 CI/CD 作业失败?

api - 允许 Gitlab 集成的安全 Kubernetes API

git - 如何创建依赖于托管在 gitlab 子组中的私有(private) go 包的 docker 镜像?

node.js - 在 GitLab CI 中为 Node.js 应用程序构建 Docker 镜像

gitlab-ci - Gitlab 屏蔽变量