Что такое Dockerfile
Что проверяют
Умеете ли вы упаковать сервис так, чтобы он собирался быстро, а запускался предсказуемо. Про Dockerfile почти всегда спрашивают с продолжением про кэш слоёв и размер образа: именно это отличает рабочий файл от скопированного из статьи.
Как отвечать
Dockerfile это рецепт сборки образа: инструкции выполняются по порядку, почти каждая даёт слой, слои кэшируются по содержимому. Базовый набор это FROM, WORKDIR, COPY, RUN, ENV, ENTRYPOINT и CMD.
Для Python-сервиса важно несколько вещей. Зависимости ставятся до копирования кода, иначе кэш слетает от любой правки. Базовый образ фиксируется тегом, а лучше дайджестом. Рядом лежит .dockerignore, чтобы в образ не уехали виртуальное окружение, кэш и история репозитория. Процесс запускается не от root. Вывод не буферизуется, иначе при падении логи теряются.
FROM python:slim
ENV PYTHONUNBUFFERED=1
WORKDIR /app
COPY requirements.txt .
RUN pip install --no-cache-dir -r requirements.txt
COPY . .
USER nobody
CMD ["python", "-m", "app"]Многоступенчатая сборка нужна, когда пакетам требуется компилятор: собираем в полном образе, в финальный кладём только установленное.
Где спотыкаются
Берут alpine ради размера. Там другая стандартная библиотека C, готовые колёса не подходят, и пакеты вроде numpy собираются из исходников: сборка растягивается, а сюрпризы вылезают уже в проде. Для Python вариант slim обычно уместнее.
Пишут команду запуска строкой, а не списком. Она уходит под оболочку, первым процессом становится sh, сигнал остановки до приложения не доходит, и контейнер убивают по таймауту.
Прокидывают секреты через ARG или ENV на сборке. Значение остаётся в истории слоёв, и достанет его любой, у кого есть образ. Ключи передают при запуске или монтируют секретом сборки.