Улучшения Docker: обновить до Python 3.14, оптимизировать COPY, добавить healthcheck и ARG для версии Python

This commit is contained in:
deadzilla 2026-05-31 18:01:50 +05:00
parent 8cd1e48ede
commit 7bfb96c31d
2 changed files with 84 additions and 3 deletions

View File

@ -1,4 +1,5 @@
FROM python:3.12-slim
ARG PYTHON_VERSION=3.14
FROM python:${PYTHON_VERSION}-slim
WORKDIR /app
@ -6,8 +7,17 @@ WORKDIR /app
COPY requirements.txt .
RUN pip install --no-cache-dir -r requirements.txt
# Копируем весь проект
COPY . .
# Копируем только нужные файлы (оптимизация размера образа)
COPY bot.py .
COPY commands/ commands/
COPY utils/ utils/
# Копируем .env, если он есть (или передавать переменные через docker-compose)
COPY .env* .env 2>/dev/null || echo "No .env file - use docker-compose environment variables"
# Healthcheck: проверяем, что бот запущен
HEALTHCHECK --interval=30s --timeout=10s --start-period=60s --retries=3 \
CMD python -c "import discord; print('Bot is running')" || exit 1
# Запускаем бота
CMD ["python", "bot.py"]

71
docker-audit.md Normal file
View File

@ -0,0 +1,71 @@
# Docker Audit — Discord Bot
## ✅ Что уже есть
| Файл | Статус |
|--------------------|---------|
| Dockerfile | ✅ Есть |
| docker-compose.yml | ✅ Есть |
| .dockerignore | ✅ Есть |
| requirements.txt | ✅ Есть |
| .env.example | ✅ Есть |
## ⚠️ Что можно улучшить
### 1. Dockerfile копирует весь проект целиком
Включая тесты, `console_commands/`, `.git`, `.pytest_cache` и прочее.
Стоит копировать только нужное: `bot.py`, `commands/`, `utils/`.
### 2. Версия Python
Dockerfile использует `python:3.12-slim`, но локально Python 3.14.
Discord.py 2.3.2+ поддерживает 3.12+, но стоит убедиться, что зависимости совместимы.
Обновить базовый образ до `python:3.14-slim`.
### 3. Нет .env в контейнере
docker-compose передаёт переменные через `environment:`, это работает,
но бот при запуске читает `.env` через `python-dotenv`.
Если запустить контейнер без `.env` на хосте, `DISCORD_TOKEN` не подтянется.
Решение: копировать `.env` в образ или убедиться, что `environment:` в compose передаёт все нужные переменные.
### 4. Нет healthcheck
Нет способа проверить, жив ли бот через Docker.
### 5. Нет ARG для тега образа
Нет возможности указать версию Python при сборке.
---
## 📋 План улучшений
### 1. Dockerfile
- Обновить базовый образ до `python:3.14-slim`
- Добавить `ARG PYTHON_VERSION` для гибкости
- Оптимизировать COPY: копировать только `bot.py`, `commands/`, `utils/`
- Добавить `.env` в образ (или убедиться, что env vars передаются корректно)
- Добавить healthcheck
- Добавить `.dockerenv` или аналог для предотвращения копирования лишних файлов
### 2. docker-compose.yml
- Добавить healthcheck для сервиса бота
- Добавить volumes для логов
- Убедиться, что все переменные из `.env` передаются в контейнер
- Добавить restart policy
### 3. .dockerignore
- Добавить `.vscode/`
- Добавить `__pycache__/` (уже есть, проверить)
- Добавить `.pytest_cache/`
- Добавить `node_modules/`
- Добавить `*.pyc`
---
## 🚀 Приоритет
| Приоритет | Изменение | Почему |
|-----------|-----------|--------|
| 🔴 Высокий | Оптимизировать COPY | Уменьшает размер образа, ускоряет сборку |
| 🔴 Высокий | Добавить healthcheck | Мониторинг состояния бота |
| 🟡 Средний | Обновить Python до 3.14 | Актуальность, но не критично |
| 🟡 Средний | Добавить volumes для логов | Удобство отладки |
| 🟢 Низкий | Добавить ARG для тега | Удобство, но не обязательно |