Вобщем не понимаю я переживаний на счет Докера, ну ушел и ушел, это блин вообще некритикал, все уже привыкли)
Но задумался вот над чем. Вобщем есть такая компания Chainguard, которая готовит такие образа в которых всегда 0 уязвимостей*, ну кроме неизвестных (* - по версии компании). Вообще, круто то, что это прям максимальный Shift left без каких-либо вспомогательных инструментов. Так вот подписка там платная и только с ней можно качать образа определенной версии. В бесплатной подписке можно пулить только образа с версией latest. Разумеется, если вы серьезный энтерпрайз, а не хипстерский стартап, то такое использовать фе. Но, что если написать такую штуку, которая определяет версию образа. Причем это вполне реально.
Например, такое:
По названию образа определяем команду для вывода версии продукта (с помощью справочника, ии или захардкоженной логики)
Запускаем необходимую команду в контейнере из latest-образа
Грепаем оттуда версию
Ретегируем образ полученной версией
Пушим в свой прайват репозиторий
Вот к примеру вручную:
Берем образ Nginx
$ docker pull cgr.dev/chainguard/nginx
Using default tag: latest
latest: Pulling from chainguard/nginx
Digest: sha256:1a01e891696587501b097645d4feead0e0c512f7919481a10115d01bc1e94d27
Status: Image is up to date for cgr.dev/chainguard/nginx:latest
cgr.dev/chainguard/nginx:latestЗапускаем необходимую команду для определения версии в контейнере
$ docker run cgr.dev/chainguard/nginx -v
nginx version: nginx/1.25.5-
Парсим версию. Лень думать, спрашиваем у жпт)
Парсим версию:
$ echo "nginx version: nginx/1.25.5" | grep -oP '(?<=nginx/)[^\s]+'
1.25.5 Ретегируем образ
$ docker tag cgr.dev/chainguard/nginx:latest <private repo>/nginx:1.25.5
-
Пушим в прайват-репу
$ docker push <private repo>/nginx:1.25.5
Кстати, интересно, кто еще об это думал или попробовал написать такое? Пообщался щас с Rus Dacent'ом . Толик об этой идее кстати рассказывал на DefCon в Нижнем Новгороде ;)
Тут вот еще есть ньюанс, с такой схемой с чейнгардом, нет возможности вытянуть конкретную версию, а только последние, которые определил. ну и latest - может быть что угодно. Например ты тянул jvm и вытянул jvm 8, потому что ее последний раз пересобрали. Понятно, что скорее там будут последние версии приезжать, но все же.
Либо вот еще идея: сделать справочник своего стека и версий, фоново выкачивать с chainguard SBOM-ы latest версии, там искать версию пакета и если она подходит, то выкачивать образ и загружать в свою репу.
Можно анализировать Dive'ом образа и определять версию:В общем есть над чем подумать, попозже попробую навоять сервис:)
Комментарии (11)
xiva
30.05.2024 22:44+3а версию указанную на карточках образов никак не проще взять в Chainguard Images , чем у вас какие то сложности непонятные к каждому образу новые команды.
SergeySabbath Автор
30.05.2024 22:44угум, отличная идея
SergeySabbath Автор
30.05.2024 22:44+1в latest - последняя сборка, но не обязательно последняя версия, а на карточке - последняя версия
RZK333
30.05.2024 22:44использовать latest - харам
https://open-policy-agent.github.io/gatekeeper-library/website/validation/disallowedtags
https://vsupalov.com/docker-latest-tag/ и так далее.
SergeySabbath Автор
30.05.2024 22:44+11 на карточке может не соответствовать версия, щас на карточке nginx 1.26.1, а когда пулишь latest приезжает 1.25.5
2 программно тоже не оч удобно будет искать по карточкам
SergeySabbath Автор
30.05.2024 22:44Тут вот еще есть ньюанс, с такой схемой с чейнгардом, нет возможности вытянуть конкретную версию, а только последние, которые определил. ну и latest - может быть что угодно. Например ты тянул jvm и вытянул jvm 8, потому что ее последний раз пересобрали. Понятно, что скорее там будут последние версии приезжать, но все же.
SergeySabbath Автор
30.05.2024 22:44Либо вот еще идея: сделать справочник своего стека и версий, фоново выкачивать с chainguard SBOM-ы latest версии, там искать версию пакета и если она подходит, то выкачивать образ и загружать в свою репу
neuroburn
cut -d "/" -f2
не ?
SergeySabbath Автор
можн и так да:)