Как стать автором
Обновить

Docker и точка. Отжимаем образа у Chainguard

Уровень сложностиПростой
Время на прочтение2 мин
Количество просмотров8.5K

Вобщем не понимаю я переживаний на счет Докера, ну ушел и ушел, это блин вообще некритикал, все уже привыкли)

Но задумался вот над чем. Вобщем есть такая компания Chainguard, которая готовит такие образа в которых всегда 0 уязвимостей*, ну кроме неизвестных (* - по версии компании). Вообще, круто то, что это прям максимальный Shift left без каких-либо вспомогательных инструментов. Так вот подписка там платная и только с ней можно качать образа определенной версии. В бесплатной подписке можно пулить только образа с версией latest. Разумеется, если вы серьезный энтерпрайз, а не хипстерский стартап, то такое использовать фе. Но, что если написать такую штуку, которая определяет версию образа. Причем это вполне реально. 

Например, такое:

  1. По названию образа определяем команду для вывода версии продукта (с помощью справочника, ии или захардкоженной логики)

  2. Запускаем необходимую команду в контейнере из latest-образа

  3. Грепаем оттуда версию

  4. Ретегируем образ полученной версией 

  5. Пушим в свой прайват репозиторий

Вот к примеру вручную:

  1. Берем образ 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

  2. Запускаем необходимую команду для определения версии в контейнере

    $ docker run cgr.dev/chainguard/nginx -v
    nginx version: nginx/1.25.5

  3. Парсим версию. Лень думать, спрашиваем у жпт)

    Парсим версию:
    $ echo "nginx version: nginx/1.25.5" | grep -oP '(?<=nginx/)[^\s]+'
    1.25.5

  4. Ретегируем образ

    $ docker tag cgr.dev/chainguard/nginx:latest <private repo>/nginx:1.25.5

  5. Пушим в прайват-репу

     $ docker push <private repo>/nginx:1.25.5

    Кстати, интересно, кто еще об это думал или попробовал написать такое? Пообщался щас с Rus Dacent'ом . Толик об этой идее кстати рассказывал на DefCon в Нижнем Новгороде ;)

    Тут вот еще есть ньюанс, с такой схемой с чейнгардом, нет возможности вытянуть конкретную версию, а только последние, которые определил. ну и latest - может быть что угодно. Например ты тянул jvm и вытянул jvm 8, потому что ее последний раз пересобрали. Понятно, что скорее там будут последние версии приезжать, но все же.

    Либо вот еще идея: сделать справочник своего стека и версий, фоново выкачивать с chainguard SBOM-ы latest версии, там искать версию пакета и если она подходит, то выкачивать образ и загружать в свою репу.

    Можно анализировать Dive'ом образа и определять версию:

    В общем есть над чем подумать, попозже попробую навоять сервис:)

Теги:
Хабы:
Всего голосов 10: ↑6 и ↓4+2
Комментарии11

Публикации

Работа

DevOps инженер
32 вакансии

Ближайшие события