python-cli
Контейнеризованное CLI-приложение: подсчёт частоты слов. Используется в уроке 6.8 и в проекте 1.
Что демонстрирует
ENTRYPOINT+CMD: аргументыdocker runдоходят до приложения;- корректные коды возврата:
0успех,1ошибка выполнения,2ошибка использования; - результат в stdout, диагностика в stderr — их можно разделить;
- чтение стандартного ввода;
- конфигурация из файла TOML и переменных окружения;
- стадия тестов, останавливающая сборку при падении.
Сборка
docker build -t wordfreq .
Запуск тестов как отдельной стадии:
docker build --target test -t wordfreq:test .
Падение тестов остановит сборку — это делает их обязательной частью pipeline.
Запуск
Справка (значение CMD по умолчанию):
docker run --rm wordfreq
Анализ стандартного ввода:
echo "кот пёс кот кот пёс мышь" | docker run --rm -i wordfreq --top 3
кот 3
пёс 2
мышь 1
Анализ файла:
docker run --rm -v "$PWD/README.md:/data/input.md:ro" wordfreq /data/input.md --top 5
Конфигурация через файл:
docker run --rm -i \
-v "$PWD/wordfreq.example.toml:/etc/wordfreq.toml:ro" \
wordfreq --config /etc/wordfreq.toml < README.md
Конфигурация через переменную окружения:
echo "раз два три четыре" | docker run --rm -i -e WORDFREQ_TOP=2 wordfreq
Проверка
Разделение потоков:
# только результат
echo "а б а" | docker run --rm -i wordfreq 2>/dev/null
# только диагностика
echo "а б а" | docker run --rm -i wordfreq 1>/dev/null
Коды возврата:
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:
docker run --rm --entrypoint id wordfreq -u
Ожидается 10001.
Локальный запуск без Docker
python -m venv .venv && . .venv/bin/activate
pip install -e . pytest==9.1.1
pytest -q
echo "кот пёс кот" | python -m wordfreq
Уборка
docker rmi wordfreq wordfreq:test