fix: Docker container exit on startup

- bot.py: добавить проверку sys.stdin.isatty() для консольного ввода
  - В Docker stdin не является терминалом, input() падал с EOFError
  - Консольный режим теперь запускается только в интерактивном терминале
- Dockerfile: добавить console_commands/, убрать копирование .env,
  использовать переменные docker-compose
This commit is contained in:
deadzilla 2026-05-31 20:23:23 +05:00
parent 7bfb96c31d
commit 6e31a7e6ff
2 changed files with 14 additions and 9 deletions

View File

@ -11,9 +11,11 @@ RUN pip install --no-cache-dir -r requirements.txt
COPY bot.py . COPY bot.py .
COPY commands/ commands/ COPY commands/ commands/
COPY utils/ utils/ COPY utils/ utils/
COPY console_commands/ console_commands
# Копируем .env, если он есть (или передавать переменные через docker-compose) # .env передаётся через docker-compose environment:
COPY .env* .env 2>/dev/null || echo "No .env file - use docker-compose environment variables" # DISCORD_TOKEN=${DISCORD_TOKEN}
# MORNING_TIME=${MORNING_TIME:-07:00}
# Healthcheck: проверяем, что бот запущен # Healthcheck: проверяем, что бот запущен
HEALTHCHECK --interval=30s --timeout=10s --start-period=60s --retries=3 \ HEALTHCHECK --interval=30s --timeout=10s --start-period=60s --retries=3 \

15
bot.py
View File

@ -118,16 +118,19 @@ def console_input():
if __name__ == "__main__": if __name__ == "__main__":
print("Введите 'stop' для остановки бота")
thread = threading.Thread(target=console_input, daemon=True)
thread.start()
try:
token = os.getenv("DISCORD_TOKEN") token = os.getenv("DISCORD_TOKEN")
if not token: if not token:
print("Ошибка: токен не найден в .env") print("Ошибка: токен не найден в .env")
sys.exit(1) sys.exit(1)
# Консольный ввод работает только в интерактивном терминале
# В Docker stdin недоступен — пропускаем консольный режим
if sys.stdin.isatty():
print("Введите 'stop' для остановки бота")
thread = threading.Thread(target=console_input, daemon=True)
thread.start()
try:
bot.run(token) bot.run(token)
except KeyboardInterrupt: except KeyboardInterrupt:
print("\nОстановка бота...") print("\nОстановка бота...")