Контейнеры и CI/CD
Линтер Dockerfile
Проверяет Dockerfile на ошибки сборки, утечки секретов, лишние слои и сломанный кэш — прямо в браузере, файл никуда не уходит.
2
ошибок
7
предупреждений
4
слоёв
1
стадий
ENV API_TOKEN со значением попадает в docker history и виден всем, у кого есть образ.
стр. 3Передавайте секрет в рантайме или через RUN --mount=type=secret.
DF-SECRET-ENV
apt-get install без -y повиснет на вопросе и сборка упадёт по таймауту.
стр. 4Добавьте -y.
DF-APT-YES
Тег :latest делает сборку невоспроизводимой.
стр. 1Укажите конкретную версию или дайджест @sha256:….
DF-LATEST
Контейнер запустится под root.
стр. 1Добавьте USER с непривилегированным пользователем в финальную стадию.
DF-ROOT
MAINTAINER устарел с Docker 1.13.
стр. 2Замените на LABEL org.opencontainers.image.authors="…".
DF-MAINTAINER
apt-get install без --no-install-recommends тянет десятки лишних пакетов.
стр. 4Добавьте --no-install-recommends.
DF-APT-RECOMMENDS
Кэш apt остаётся в слое и раздувает образ.
стр. 4В конце той же RUN: && rm -rf /var/lib/apt/lists/*
DF-APT-LISTS
COPY всего проекта стоит до установки зависимостей — любая правка кода сбрасывает кэш и переустанавливает всё заново.
стр. 5Сначала COPY package*.json, затем установка, и только потом COPY остального.
DF-CACHE-ORDER
CMD в shell-форме запускается через /bin/sh -c — процесс не получит SIGTERM и контейнер будет убиваться по таймауту.
стр. 9Используйте exec-форму: CMD ["исполняемый", "аргумент"].
DF-EXEC-FORM
Сборка идёт в том же слое, что и рантайм — компилятор и исходники поедут в прод-образ.
стр. 1Разделите на стадии: FROM … AS build, затем FROM … и COPY --from=build.
DF-MULTISTAGE
Нет HEALTHCHECK — оркестратор не узнает, что процесс жив, но не отвечает.
стр. 1HEALTHCHECK CMD curl -f http://localhost:3000/health || exit 1
DF-HEALTHCHECK
WORKDIR не задан — сборка идёт в корне файловой системы.
стр. 1Добавьте WORKDIR /app.
DF-WORKDIR
Версии пакетов не зафиксированы — образ будет разным в разные дни.
стр. 4Пишите пакет=версия, например curl=8.5.0-2ubuntu10.
DF-APT-PIN
npm install может обновить лок-файл прямо в сборке.
стр. 6В образах используйте npm ci — он ставит ровно то, что в package-lock.json.
DF-NPM-CI