Правильное содержание агента сборки VSTS / Azure Devops в Docker в чистоте, но в кэше - PullRequest
0 голосов
/ 13 февраля 2019

Мы добавили в сборочный кластер 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(обязательно) - ссылка на изображение есть в нескольких репозиториях

, что препятствует удалению последней.Однако это не совсем чистый способ сделать это.Должен быть лучший способ?

1 Ответ

0 голосов
/ 26 августа 2019

Возможно, вы уже нашли решение, но для остальной части сообщества было бы полезно получить ответ здесь.

docker prune имеет ограниченную цель.Он был создан для решения проблемы с очисткой всех локальных образов Docker.(Как было упомянуто thaJeztah здесь )

Для более точного удаления изображений лучше разделить эту задачу на две части: 1. выбрать / отфильтроватьИзображения для удаления 2. Удалить список выбранных изображений

Например:

docker image rm $(docker image ls --filter reference=docker --quiet)
docker image rm $(sudo docker image ls | grep 1.14 | awk '{print $3}')
docker image ls --filter reference=docker --quiet | xargs docker image rm

Можно комбинировать предложения фильтров, чтобы получить именно то, что вы:
(я используюГлавный узел Kubernetes в качестве примера среды)

$ docker images

REPOSITORY                           TAG                 IMAGE ID            CREATED             SIZE
k8s.gcr.io/kube-proxy                v1.14.2             5c24210246bb        3 months ago        82.1MB
k8s.gcr.io/kube-apiserver            v1.14.2             5eeff402b659        3 months ago        210MB
k8s.gcr.io/kube-controller-manager   v1.14.2             8be94bdae139        3 months ago        158MB
k8s.gcr.io/kube-scheduler            v1.14.2             ee18f350636d        3 months ago        81.6MB  # before
quay.io/coreos/flannel               v0.11.0-amd64       ff281650a721        6 months ago        52.6MB
k8s.gcr.io/coredns                   1.3.1               eb516548c180        7 months ago        40.3MB  # since
k8s.gcr.io/etcd                      3.3.10              2c4adeb21b4f        8 months ago        258MB
k8s.gcr.io/pause                     3.1                 da86e6ba6ca1        20 months ago       742kB

$ docker images --filter "since=eb516548c180" --filter "before=ee18f350636d" 

REPOSITORY               TAG                 IMAGE ID            CREATED             SIZE
quay.io/coreos/flannel   v0.11.0-amd64       ff281650a721        6 months ago        52.6MB

$ docker images --filter "since=eb516548c180" --filter "reference=quay.io/coreos/flannel" 
REPOSITORY               TAG                 IMAGE ID            CREATED             SIZE
quay.io/coreos/flannel   v0.11.0-amd64       ff281650a721        6 months ago        52.6MB

$ docker images --filter "since=eb516548c180" --filter "reference=quay*/*/*" 
REPOSITORY               TAG                 IMAGE ID            CREATED             SIZE
quay.io/coreos/flannel   v0.11.0-amd64       ff281650a721        6 months ago        52.6MB

$ docker images --filter "since=eb516548c180" --filter "reference=*/*/flan*" 
REPOSITORY               TAG                 IMAGE ID            CREATED             SIZE
quay.io/coreos/flannel   v0.11.0-amd64       ff281650a721        6 months ago        52.6MB

Как уже упоминалось в документации , images / image ls, фильтр намного лучше, чем фильтр docker prune, который поддерживает until только предложение:

The currently supported filters are:
• dangling (boolean - true or false)  
• label (label=<key> or label=<key>=<value>)  
• before (<image-name>[:<tag>], <image id> or <image@digest>) - filter images created before given id or references
• since (<image-name>[:<tag>], <image id> or <image@digest>) - filter images created since given id or references

Если вам нужно более одного фильтра, тогда передайте несколько флагов (например, --filter "foo=bar" --filter "bif=baz")

Вы можете использовать другие команды linux cli для фильтрации docker imagesвывод:

grep "something"      # to include only specified images
grep -v "something"   # to exclude images you want to save
sort [-k colN] [-r] [-g]] | head/tail -nX  # to select X oldest or newest images

Комбинируя их и помещая результат в конвейер CI / CD, вы можете оставить только необходимые образы в локальном кэше, не собирая много мусора на сервере сборки.

Я скопировал здесь хороший пример использования этого подхода пров комментарий :

#example of deleting all builds except last 2 for each kind of image 
#(the image kind is based on the Repository value.)

#If you want to preserve just last build modify to tail -n+2.

# delete dead containers
docker container prune -f

# keep last 2 builds for each image from the repository
for diru in `docker images --format "{{.Repository}}" | sort | uniq`; do
    for dimr in `docker images --format "{{.ID}};{{.Repository}}:{{.Tag}};'{{.CreatedAt}}'" --filter reference="$diru" | sed -r "s/\s+/~/g" | tail -n+3`; do 
        img_tag=`echo $dimr | cut -d";" -f2`; 
        docker rmi $img_tag;
    done;
done

# clean dangling images if any
docker image prune -f
strajansebastian
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...