Мы добавили в сборочный кластер Kubernetes агент сборки, который мы используем для сборки наших приложений в рамках наших конвейеров Azure Devops.Мы создали наш собственный образ на основе устаревшего Microsoft / vsts-agent-docker на Github.
Агент сборки использует Docker вне Docker (DooD) для создания образов в нашем кластере разработки.
Этот агент работал хорошо в течение нескольких дней, но иногда в командах докера в нашем конвейере сборки иногда возникала ошибка:
Ответ об ошибке от демона: Нет такого образа: fooproject: ci-3284.2 / usr / local / bin / docker с ошибкой с кодом возврата: 1
Мы поняли, что агент построения создает тонны изображений, которые не были удалены.Существовали тонны изображений, которые блокировали агент сборки, и отсутствовали изображения, которые могли бы объяснить сообщение об ошибке «нет такого изображения».
Добавив шаг в наши конвейеры сборки с помощью следующей команды, мы смогли снова заставить нашего агента сборки работать:
docker system prune -f -a
Но, конечно, это затем удаляет все наши образы, и онидолжен быть построен с нуля каждый раз, что заставляет наши сборки занимать слишком много времени.
Я уверен, что это должно быть решенной проблемой, но я не смог найти никакой документации по нормальной стратегиидля работы с докеризованным агентом сборки, со временем забитым.Будучи новичком в докере и kubernetes, я, возможно, просто не знаю, что я ищу. Каков наилучший способ создания закрепленного агента сборки, который остается чистым и функциональным при сохранении кэша?
РЕДАКТИРОВАТЬ: Некоторые идеи:
- Создайте шаг сборки, который очищает все, кроме самого последнего образа для данного конвейера (хотя это может привести к засорению сервера сборки).
- Запустите задачу cron, которая удаляет все образы каждые x дней(Это может привести к медленной сборке в первый раз после запуска задания и может привести к засорению сервера сборки, если он будет интенсивно использоваться.
- Очистить все образы ночью и запускать все сборки вне рабочих часов. Таким образом,сборки будут выполняться быстро в течение дня. Однако интенсивное использование может все еще засорить сервер сборки.
РЕДАКТИРОВАТЬ 2:
Я нашел кого-то с Проблема с докером на Github , которая, кажется, пытается сделать то же самое, что и я. Он придумал решение, которое он описал следующим образом:
Я точно пытался выяснить,как удалить "старые" образы из моей автоматизированной среды сборки без удаления моих сборочных зависимостей.Это означает, что я не могу просто удалить по возрасту, потому что образ nodejs может не изменяться неделями, в то время как сборки моего приложения могут быть бесполезными буквально за минуты.
docker image rm $(docker image ls --filter reference=docker --quiet)
Этот маленький драгоценный каменьэто именно то, что мне было нужно.Я удалил свое имя хранилища в переменной reference (не требующей пояснений.) Поскольку я помечаю как номер сборки, так и latest команду docker image rm
не удается на изображениях, которые я хочу сохранить.Я действительно не люблю использовать ошибки демона в качестве механизма защиты, но он эффективен.
Пытаясь следовать этим указаниям, я применил тег latest
ко всему, что создается в процессе,и затем запустите
docker image ls --filter reference=fooproject
Если я попытаюсь удалить их, я получаю следующую ошибку:
Ошибка ответа от демона: конфликт: невозможно удалить b870ec9c12cc(обязательно) - ссылка на изображение есть в нескольких репозиториях
, что препятствует удалению последней.Однако это не совсем чистый способ сделать это.Должен быть лучший способ?