优化自托管构建代理中的 Docker 映像存储和缓存管理

问题描述 投票:0回答:1

我在 CI/CD 管道中面临着自托管构建代理的重大问题,我需要一个全面的解决方案。详情如下:

建立代理和服务

我有 6 个构建代理。 我管理着 30-40 个管道中的服务。

问题

在构建过程中,由于 Docker 镜像和缓存层的累积,我的自托管构建代理的磁盘已满。 我们已经在使用临时基础镜像来最小化 Docker 镜像的大小。

要求

我需要一个解决方案,既可以保留缓存层以加快构建过程,又可以确保磁盘不会变满。

我的尝试和预期结果

我尝试了多种解决方案来解决该问题,但没有一个完全令人满意:

Docker System Prune -a 
  • 命令:docker system prune -a
  • 预期结果:通过删除所有未使用的数据(容器、网络、图像和缓存)来释放磁盘空间。
  • 实际结果:该解决方案显着减慢了构建过程,因为它删除了必要的缓存层。

Azure Pipeline 中的 Docker 映像删除

命令:

bash: |
  docker rmi img/address/image_name:$(Build.BuildId)
displayName: "Docker Delete"
  • 预期结果:删除特定图像以释放空间。
  • 实际结果:此命令没有释放足够的空间来防止磁盘变满。
  • 所需的解决方案 我需要一个能够保持构建过程快速并防止磁盘变满的解决方案。如有必要,可以删除镜像和容器。

请提供解决以下问题的解决方案:

  • 保持构建速度:确保构建过程保持高效和快速。

  • 有效的磁盘空间管理:实施有效管理磁盘空间的策略。

  • 保留缓存层:找到一种方法来保留必要的缓存层,同时释放磁盘空间。

  • 自动化和维护:利用脚本或工具自动执行清理过程,无需人工干预。

您能提供满足这些要求的解决方案吗?

docker azure-devops linux-kernel azure-pipelines docker-registry
1个回答
0
投票

您正在使用自托管代理,您应该在本地维护资源,而不是在管道内维护资源。

作为一种可能的解决方法,您可以创建一个单独的管道来删除所有未使用的映像和已停止的容器,并配置定期触发的计划。

  1. 您可以使用
    ,而不是使用删除所有未使用数据的
    Docker System Prune -a
  • docker image prune -a --filter "until=24h"
    命令,该命令将删除 24 小时前创建的所有未使用的图像。
  • docker container prune --filter "until=24h"
    命令,该命令将删除 24 小时前创建的所有已停止容器
  1. 将自托管代理作为 VM 资源添加到环境。使用 部署作业 在目标计算机上运行上述脚本。

  2. 在管道中添加计划触发器,以便可以触发它定期清理图像和容器。

下面是一个示例 yaml 供您参考。

# YAML file in the main branch
trigger:
- none

schedules:
- cron: '0 0 * * *'
  displayName: Daily midnight build
  branches:
    include:
    - main

jobs:
- deployment: VMDeploy
  displayName: Deploy to VMs
  environment: 
    name: VMenv
    resourceType: virtualMachine
  strategy:
     runOnce:
        deploy:   
          steps:
            - task: Bash@3
              inputs:
                targetType: 'inline'
                script: |
                  docker image prune -a --filter "until=24h" -f
                  docker container prune --filter "until=24h" -f
最新问题
© www.soinside.com 2019 - 2025. All rights reserved.