ssb*_*191 6 caching docker gitlab-ci dind
我有一个gitlab-ci.yml这样的:
build and push docker image:
stage: publish
variables:
DOCKER_REGISTRY: amazon-registry
AWS_DEFAULT_REGION: ap-south-1
APP_NAME: sample-app
DOCKER_HOST: tcp://docker:2375
image:
name: amazon/aws-cli
entrypoint: [""]
services:
- docker:dind
before_script:
- amazon-linux-extras install docker
script:
- docker build -t $DOCKER_REGISTRY/$APP_NAME:master .
- aws ecr get-login-password | docker login --username AWS --password-stdin $DOCKER_REGISTRY
- docker push $DOCKER_REGISTRY/$APP_NAME:master
Run Code Online (Sandbox Code Playgroud)
这一步需要 19=8 分钟才能完成,因为 docker 镜像步骤没有被缓存。我希望能够缓存 before_scriptamazon-linux-extras install docker以及我正在构建的 docker 映像。我们在自己的 gitlab runners 上运行。我已经搜索了答案,但找到了 4 年前的解决方案。有没有办法解决这个问题?另外,是否会放弃docker:dind帮助?
小智 27
我尝试过的一件事是在 docker build 中使用缓存层。
您可以从注册表中提取现有映像,然后使用--cache-from参数进行构建。
工作外壳将是这样的:
variables:
IMAGE_TAG: $DOCKER_REGISTRY/$APP_NAME:master
script:
- aws ecr get-login-password | docker login --username AWS --password-stdin $DOCKER_REGISTRY
- docker pull $IMAGE_TAG || true
- docker build --cache-from $IMAGE_TAG -t $IMAGE_TAG .
- docker push $IMAGE_TAG
Run Code Online (Sandbox Code Playgroud)
gitlab-ci官方文档中也提到了这个方法。
Ada*_*all 13
Gitlab CI 缓存的工作原理并非如此。例如,如果您有一个安装 npm 依赖项的作业,您可以缓存结果node_modules目录,这样npm install就不需要再次运行,但它对于安装系统包等事情没有帮助。
关于该docker:dind服务,即使您将docker build...作业docker push ...使用的图像切换为docker:latest. 这有点违反直觉,但能够运行这些命令的唯一方法是使用 docker-in-docker 服务。
不过,你也不是运气不好。我建议您将before_script阶段中的步骤移至您自己的扩展amazon/aws-cli. 只要您有权访问 docker hub、Gitlab 包含的注册表(如果使用 gitlab.com 则可用,否则管理员必须启用/配置它)、Amazon 的注册表(我认为是 ECR?)或私人运行的注册表,您就可以创建您自己的自定义图像并在 Gitlab CI 管道中使用它们。
这是一个 Dockerfile 示例:
FROM amazon/aws-cli
RUN amazon-linux-extras install docker
Run Code Online (Sandbox Code Playgroud)
这就是扩展现有amazon/aws-cli映像并将before_script安装移动到 Docker 所需的全部内容。文件完成后,运行
docker build /path/to/dockerfile-directory -t my_tag:latest
Run Code Online (Sandbox Code Playgroud)
之后,您需要登录到注册表,docker login my.registry.example.com并推送映像docker push my_tag:latest。如果您不使用 Gitlab 的注册表或公共 docker hub,则需要配置您的作业或运行程序(两者),以便它们可以通过您的注册表进行身份验证。您可以在这里阅读:https://docs.gitlab.com/ee/ci/docker/using_docker_images.html#define-an-image-from-a-private-container-registry
接下来,您只需在管道中使用它:
FROM amazon/aws-cli
RUN amazon-linux-extras install docker
Run Code Online (Sandbox Code Playgroud)
为了节省管道时间(如果适用),您可以做的另一件事是仅在 Dockerfile 更改时运行此步骤。这样,如果没有,但其他作业依赖它,他们可以重复使用最后创建的图像。您可以使用rules关键字和以下命令来做到这一点changes:
docker build /path/to/dockerfile-directory -t my_tag:latest
Run Code Online (Sandbox Code Playgroud)
根级别when: never将作业默认设置为从不运行,但该rules部分会检查 Dockerfile 是否有更改(如果需要,则接受多个文件)。如果发生变化,作业将始终运行。
您可以在此处查看有关rules关键字的详细信息:https ://docs.gitlab.com/ee/ci/yaml/#rules
您可以在此处查看有关 Gitlab CI 自定义 docker 映像的详细信息:https ://docs.gitlab.com/ee/ci/docker/using_docker_images.html
| 归档时间: |
|
| 查看次数: |
1638 次 |
| 最近记录: |