You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在AWS Lightsail中自动清理未使用的容器镜像?

优化AWS Lightsail未使用容器镜像自动删除方案

核心问题分析

你当前的脚本仅默认保留第一个镜像,无法适配多容器部署场景,也不能精准识别当前正在被部署使用的镜像,容易误删运行中镜像,或因冗余镜像积累导致AWS拒绝推送请求。

改进方案

通过AWS CLI获取当前部署实际使用的镜像列表,只保留这些活跃镜像,删除其余所有未被使用的冗余镜像,适配单/多容器部署场景。

修改后的.gitlab-ci.yml脚本

deploy:
  stage: Deploy
  only:
    - tags
    - main
  image: registry.gitlab.com/my-group/my-project:deployment
  services:
    - docker:dind
  needs: ["build_web"]
  before_script:
    - docker login registry.gitlab.com -u ${CI_REGISTRY_USER} -p ${CI_REGISTRY_PASSWORD}
  script:
    - docker buildx build -t ${SERVICE_IMAGE} -f Dockerfile .
    # 获取当前部署正在使用的所有镜像(支持多容器)
    - used_images=$(aws lightsail get-container-service-deployment --service-name ${SERVICE_NAME} --query "deployment.containers[*].image" --output text | tr '\t' '\n')
    # 获取服务下所有存在的容器镜像
    - all_images=$(aws lightsail get-container-images --service-name ${SERVICE_NAME} --query "containerImages[].image" --output text | tr '\t' '\n')
    # 遍历删除未被使用的镜像
    - |
      for image in $all_images; do
        if ! echo "$used_images" | grep -q "^$image$"; then
          echo "删除未使用镜像: $image"
          aws lightsail delete-container-image --service-name ${SERVICE_NAME} --image "$image"
        fi
      done
    - aws lightsail push-container-image --service-name ${SERVICE_NAME} --label ${SERVICE_NAME}-${CI_PIPELINE_ID} --image ${SERVICE_IMAGE}
    - |
      aws lightsail create-container-service-deployment \
        --region us-east-2 \
        --service-name ${SERVICE_NAME} \
        --output yaml \
        --containers "{
          \"${SERVICE_NAME}\": {
            \"image\": \":${SERVICE_NAME}.${SERVICE_NAME}-${CI_PIPELINE_ID}.latest\",
            \"environment\": {
              \"PORT\": \"3001\"
            },
            \"ports\": {
              \"3001\": \"HTTP\"
            }
          }
        }" \
        --public-endpoint "{
          \"containerName\": \"${SERVICE_NAME}\",
          \"containerPort\": 3001,
          \"healthCheck\": {
            \"path\": \"/\",
            \"timeoutSeconds\": 2,
            \"intervalSeconds\": 5,
            \"healthyThreshold\": 2,
            \"unhealthyThreshold\": 2,
            \"successCodes\": \"200-499\"
          }
        }"
  after_script:
    - docker push ${SERVICE_IMAGE}
  environment: production

关键修改说明

  • 精准识别活跃镜像:通过aws lightsail get-container-service-deployment从当前生效的部署配置中提取所有容器使用的镜像,覆盖多容器场景。
  • 安全清理逻辑:用grep精准匹配每个镜像是否在活跃列表中,仅删除未匹配的冗余镜像,避免误删。
  • 格式兼容处理:用tr '\t' '\n'将CLI输出的制表符分隔内容转为换行,确保grep匹配的准确性。

内容的提问来源于stack exchange,提问作者Christopher Wrogg

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.15 04:08:14