Пример использования podman/docker
Создадим контейнер в котором будет крутится среда интерпретатора
python>, для работы скрипта простенького бота из мессенджера Telegram.
Для чего нужны контейнеры, мне, как и многим будет удобнее понять на подобном примере. Скажу сразу, понятно, что скрипт, пример которого я приведу, можно будет запустить и без docker или podman, создав как обычно виртуальное окружение на своей машине. Но по какой-то неведомой причине, такой скрипт может остановиться, как было у меня, и просто переставать работать. А если мы его запустим со специальными опциями, через созданный образ podman или docker, то в таком случае контейнер перезапустится самостоятельно, и наш скрипт будет активным постоянно, пока мы его не остановим, если это захотим.
Итак, давайте посмотрим как я создам скрипт на языке pyhton, и запущу его в контейнере.
Сначала нужно установить podman или docker на свой компьютер, или на сервер, т.е. на ту машину на которой планируется запустить ваш скрипт. Как это сделать описано здесь: Docker/Podman установка и первый запуск
Итак, когда докер/подман установлен, то создаём каталог, в котором создаём два файла. Файл скрипта который нужно будет запустить в докере, и файл Dockerfile.
Или можете просто склонировать уже готовый проект:
Содержимое файла Dockerfile
☯
Terminal:
⌕
≡
✕
FROM python:latest # Установка необходимых зависимостей RUN pip install telebot RUN pip install git+https://github.com/Uberi/speech_recognition.git RUN pip install pydub RUN pip install requests # Обновление системы и установка необходимых пакетов RUN apt update RUN apt upgrade -y RUN apt install -y ffmpeg # Копировать файл скрипта из текущего каталога, внутрь контейнера в корень COPY audio_to_text.py . # Точкой входа в контейнер, установим запуск этого скрипта ENTRYPOINT ["python", "audio_to_text.py"] # и укажем опцию перезапуска контейнера внутри образа, в случае остановки CMD ["--restart=always"]
Содержимое файла скрипта audio_to_text.py, соблюдаем оступы, это язык python
☯
Terminal:
⌕
≡
✕
import os import telebot import speech_recognition from pydub import AudioSegment import requests # при запуске контейнера вставить свой токен, который дал BotFather в Telegram при регистрации нашего бота #Поэтому при создании контейнера нужно передавать в параметрах контейнеру Docker, используя переменные среды. #docker run -e TOKEN='ваш токен вашего бота полученного у @botfather в телеграмм' my_image #здесь мы берём эту переменную из среды и помещаем в локальную переменную скрипта token = os.environ['TOKEN'] bot = telebot.TeleBot(token) welcome_message = 'Привет, если ты отправишь сюда голосовое, я переведу его в текст и выведу в этот чат' # Add a handler for the /start command @bot.message_handler(commands=['start']) def send_welcome(message): # Send the welcome message along with the menu options bot.reply_to(message, welcome_message) def oga2wav(filename): # Конвертация формата файлов new_filename = filename.replace('.oga', '.wav') audio = AudioSegment.from_file(filename) audio.export(new_filename, format='wav') return new_filename def recognize_speech(oga_filename): # Перевод голоса в текст + удаление использованных файлов wav_filename = oga2wav(oga_filename) recognizer = speech_recognition.Recognizer() with speech_recognition.WavFile(wav_filename) as source: wav_audio = recognizer.record(source) text = recognizer.recognize_google(wav_audio, language='ru') if os.path.exists(oga_filename): os.remove(oga_filename) if os.path.exists(wav_filename): os.remove(wav_filename) return text def download_file(bot, file_id): # Скачивание файла, который прислал пользователь file_info = bot.get_file(file_id) downloaded_file = bot.download_file(file_info.file_path) filename = file_id + file_info.file_path filename = filename.replace('/', '_') with open(filename, 'wb') as f: f.write(downloaded_file) return filename @bot.message_handler(content_types=['voice']) def transcript(message): # Функция, отправляющая текст в ответ на голосовое filename = download_file(bot, message.voice.file_id) text = recognize_speech(filename) bot.send_message(message.chat.id, text) # Запускаем бота. bot.polling()
создаём свой образ по Dockerfile через podman
podman build -t name_yours_image .
запускаем контейнер в фоновом режиме, указывая токен своего бота в переменную среды TOKEN
podman run -d -e TOKEN='ваш токен' --restart=always --restart=unless-stopped name_yours_image
Вот и всё, теперь у нас полностью рабочее приложение бота в контейнере, в фоновом режиме. Будет работать пока работает сервер, без остановки.
-
- Roman Sakhno
Комментарии (0):
Для добавления комментариев надо войти в систему.
Если Вы ещё не зарегистрированы на сайте, то сначала зарегистрируйтесь.