docker run --rm -i hadolint/hadolint < Dockerfiledocker run --rm -i hadolint/hadolint hadolint --ignore DL3008 - < Dockerfilefind . -name 'Dockerfile*' -print0 | xargs -0 -I{} sh -c 'echo "--- {}"; docker run --rm -i hadolint/hadolint < "{}"'Приём общий, не только про hadolint: инструмент, умеющий читать со stdin, запускается из образа через -i и не требует установки. Ни менеджера пакетов, ни версии в системе, ни мусора после — --rm уносит контейнер сразу.
Дефис в hadolint --ignore DL3008 - — это явное указание читать со stdin. Нужен, когда добавляются свои аргументы: без него линтер ждёт путь к файлу и не найдёт его внутри контейнера, потому что файл туда не монтировался.
Что ловит осмысленного: незапиненные версии пакетов (apt-get install curl без версии — источник невоспроизводимых сборок), отсутствие --no-install-recommends, ADD там, где хватает COPY, cd вместо WORKDIR, root-пользователь по умолчанию.
Код возврата ненулевой при найденных проблемах, поэтому команда без изменений встаёт шагом в CI. Полезно сразу задать порог: по умолчанию линтер ругается и на стилистику, и с ходу сделать сборку красной на существующем репозитории — верный способ, чтобы правило отключили целиком.