如何在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
相关产品推荐
相关产品推荐

