docker build --check - вбудований лінтер Dockerfile у BuildKit. Він аналізує Dockerfile без виконання збирання і виводить попередження з посиланнями на опис кожного правила.
docker build --check .
Приклад реального виводу на проблемному Dockerfile:
FROM php:8.5-cli-alpine as base
ARG APP_KEY=secret
ENV APP_KEY $APP_KEY
WORKDIR app
CMD php -v
WARNING: FromAsCasing - 'as' and 'FROM' keywords' casing do not match
WARNING: SecretsUsedInArgOrEnv - Do not use ARG or ENV instructions for sensitive data
WARNING: LegacyKeyValueFormat - "ENV key=value" should be used
WARNING: WorkdirRelativePath - Relative workdir "app" can have unexpected results
WARNING: JSONArgsRecommended - JSON arguments recommended for CMD
Що означають найкорисніші правила:
SecretsUsedInArgOrEnv- змінна з назвою, схожою на секрет (KEY,TOKEN,PASSWORD), вARGчиENV. Значення лишиться в історії чи метаданих образу - требаRUN --mount=type=secret;JSONArgsRecommended-CMD php-fpmу «shell-формі» запускає процес через/bin/sh -c, і сигналSIGTERMотримує оболонка, а не застосунок: контейнер не завершується коректно. Правильно -CMD ["php-fpm"];WorkdirRelativePath- відноснийWORKDIRзалежить від попереднього значення в базовому образі, яке може змінитися;LegacyKeyValueFormat- застарілий записENV key value;FromAsCasing,StageNameCasing- стилістична узгодженість;UndefinedVar,UndefinedArgInFrom- використання змінної, яку ніде не оголошено (друкарські помилки, що непомітно дають порожнє значення).
Як вбудувати в процес:
- у CI - окремий крок перед збиранням;
- перетворити попередження на помилки - директивою на початку Dockerfile:
# syntax=docker/dockerfile:1
# check=error=true
- вимкнути окреме правило свідомо:
# check=skip=JSONArgsRecommended.
Зв'язок з іншими інструментами: Hadolint - популярний сторонній лінтер з ширшим набором правил (зокрема перевіркою скриптів у RUN через ShellCheck). docker build --check зручний тим, що вже вбудований і знає семантику BuildKit.
Під час звичайного docker build ці перевірки теж виконуються, а попередження показуються в кінці виводу - їх просто легко не помітити.