Когда мы нажимаем изображение контейнера к реестру Google Artifact с тем же тегом, что и существующее изображение, тег на существующем изображении удален, оставляя нам изображение без тега.
Все изображения занимают пространство и рассчитывают на ваш счет. Предполагая, что вы не используете для ненужных изображений, не было бы неплохо, если бы мы могли удалить все их сразу?
Существующие решения
В отличие от политики жизненного цикла ECR Amazon, есть В настоящее время Нет белого перчатки (официальный) способ сделать это на GCP. Но у нас есть варианты.
Я видел несколько способов решать эту проблему, особенно GCR Cleaner , который упоминается в Google контейнерных реестра Официальная документация . Есть также несколько хороших методов в этом Вопрос переполнения стека
Дайте эти подходы к чтению, чтобы увидеть, могут ли они соответствовать вашему случаю использования.
Мое решение
Мое решение использует планировщик Cloud Build и Cloud с помощью скрипты PowerShell и Shell. Это немного проще, чем решения, упомянутые выше, но хорошо работает.
Команды ниже предназначены для Google Cloud Реестр артефактов (Не быть путать с Регистрация контейнера ). Вы можете легко изменить gcloud
Команды ниже, чтобы приспособиться к последнему.
Предварительные условия
- Учетная запись услуг для вашего планировщика облачного планировщика с ролью редактора сборки Cloud Build, поэтому она может вызвать сборки.
- Ваша учетная запись службы Cloud Build должна иметь разрешение на список изображений реестра артефактов в вашем проекте, но вам может потребоваться дать ему дополнительные
Artifactregistry.versions.delete
разрешение. - Репозиторий Git, содержащий 2 файла ниже, добавляется в качестве источника к вашему загрузку облака.
Облачный сценарий сборки
Установите _Repo
Переменная замещения в вашем облачном морозе триггера к репозиторию изображений, которое вы хотите очистить, например:
us-central1-docker.pkg.dev/my-project/my-container-apps
# cloudbuild.yaml steps: - id: List untagged images name: gcr.io/cloud-builders/gcloud entrypoint: sh args: - -c - | gcloud artifacts docker images list $_REPO --include-tags \ --filter='-tags:*' --format=json > untagged.json cat untagged.json - id: Format list of untagged images name: mcr.microsoft.com/powershell entrypoint: pwsh args: - ./New-UntaggedImageList.ps1 - id: Delete untagged images name: gcr.io/cloud-builders/gcloud entrypoint: sh args: - -c - | if test -f clean.txt; then while read i; do gcloud artifacts docker images delete --quiet "$i" done < clean.txt else echo "No untagged images." fi
Если вы свободно говорят в сценарии Shell, вы, вероятно, можете пропустить шаг PowerShell выше и набрать скрипт оболочки на последнем шаге с некоторыми разбором JSON. По сравнению с моим подходом это уборщик, потому что он не требует записи на файловую систему и дополнительный шаг сборки. Но я считаю, что PowerShell лучше использовать при работе с Json Omited by GCloud
.
PowerShell Script
Сценарий PowerShell принимает наш untaged.json
Разбирает его, объединяет каждый пакет и переваривать (SHA256) в строку на одной строке и добавляет его в текстовый файл. Если файл JSON пуст ( i.e. , нет ненужных изображений), этот шаг пропускается.
# New-UntaggedImageList.ps1 $UntaggedImages = Get-Content untagged.json | ConvertFrom-Json If ($UntaggedImages) { $UntaggedImages | ForEach-Object { $p, $v = $_.package, $_.version Add-Content clean.txt "$p`@$v" } } Else { Write-Host 'No untagged images.' }
Конец
Я устанавливаю свою частоту работы планировщика облаков для 33 15 * * 4
Так что он работает раз в неделю в четверг в 15:33 в моем часовом поясе. Вместо того, чтобы использовать планировщик облака для запуска вашей сборки, вы, безусловно, можете интегрировать шаги в существующую сборку.
Если этот пост был полезен для вас или у вас есть лучшее решение, я бы хотел услышать об этом.
Оригинал: «https://dev.to/misterorion/delete-untagged-images-on-google-cloud-440i»