Главная/Материалы/Материал

python-cli

Контейнеризованное CLI-приложение: подсчёт частоты слов. Используется в уроке 6.8 и в проекте 1.

Что демонстрирует

  • ENTRYPOINT + CMD: аргументы docker run доходят до приложения;
  • корректные коды возврата: 0 успех, 1 ошибка выполнения, 2 ошибка использования;
  • результат в stdout, диагностика в stderr — их можно разделить;
  • чтение стандартного ввода;
  • конфигурация из файла TOML и переменных окружения;
  • стадия тестов, останавливающая сборку при падении.

Сборка

bash
docker build -t wordfreq .

Запуск тестов как отдельной стадии:

bash
docker build --target test -t wordfreq:test .

Падение тестов остановит сборку — это делает их обязательной частью pipeline.

Запуск

Справка (значение CMD по умолчанию):

bash
docker run --rm wordfreq

Анализ стандартного ввода:

bash
echo "кот пёс кот кот пёс мышь" | docker run --rm -i wordfreq --top 3
text
кот   3
пёс   2
мышь  1

Анализ файла:

bash
docker run --rm -v "$PWD/README.md:/data/input.md:ro" wordfreq /data/input.md --top 5

Конфигурация через файл:

bash
docker run --rm -i \
    -v "$PWD/wordfreq.example.toml:/etc/wordfreq.toml:ro" \
    wordfreq --config /etc/wordfreq.toml < README.md

Конфигурация через переменную окружения:

bash
echo "раз два три четыре" | docker run --rm -i -e WORDFREQ_TOP=2 wordfreq

Проверка

Разделение потоков:

bash
# только результат
echo "а б а" | docker run --rm -i wordfreq 2>/dev/null
# только диагностика
echo "а б а" | docker run --rm -i wordfreq 1>/dev/null

Коды возврата:

bash
echo "текст" | docker run --rm -i wordfreq > /dev/null; echo "успех: $?"
docker run --rm wordfreq /nonexistent.txt 2>/dev/null; echo "нет файла: $?"
docker run --rm wordfreq --no-such-option 2>/dev/null; echo "неверный аргумент: $?"

Ожидается 0, 1, 2.

Запуск не от root:

bash
docker run --rm --entrypoint id wordfreq -u

Ожидается 10001.

Локальный запуск без Docker

bash
python -m venv .venv && . .venv/bin/activate
pip install -e . pytest==9.1.1
pytest -q
echo "кот пёс кот" | python -m wordfreq

Уборка

bash
docker rmi wordfreq wordfreq:test
Markdown на GitHub ↗