Короткий ответ
Цепочка поставок ПО — все внешние компоненты (библиотеки, базовые образы, инструменты сборки, registry), от которых зависит приложение; базовый риск — использование непроверенных, неподписанных или версионно «плавающих» зависимостей, через которые может попасть вредоносный или уязвимый код.
Как это работает подробнее
современное приложение почти всегда собирается из десятков или сотен сторонних пакетов и базового образа, которые разработчики не пишут сами и не всегда проверяют. Если один из этих компонентов скомпрометирован (взломан аккаунт автора пакета, подменена версия), вредоносный код попадает в итоговый артефакт.
Что использовать на практике
- Практика. фиксируют версии зависимостей (lock-файлы:
package-lock.json,poetry.lock), используют конкретные теги образов с диджестом вместоlatest, подключают сканирование зависимостей (SCA) в CI, загружают образы только из доверенных registry. - Проверка. Ожидаемое поведение: при повторной сборке с FROM node:latest через месяц можно получить другую major-версию Node.js и неожиданно отличное от прошлой сборки поведение; фиксация версии и дайджеста гарантирует, что docker build всегда использует один и тот же проверенный базовый слой.
Подводные камни
- Ошибка. использовать тег
latestдля базового образа в production, из-за чего сборка в разное время даёт разные, непредсказуемые версии; устанавливать зависимости без lock-файла; доверять любому публичному образу из Docker Hub без проверки источника и сканирования.