Пример использования 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
Вот и всё, теперь у нас полностью рабочее приложение бота в контейнере, в фоновом режиме. Будет работать пока работает сервер, без остановки.
-
Создано 23.06.2023 17:00:00
-
Roman Sakhno

Комментарии (1):
https://chat.deepseek.com/share/d08m0hnmffjpl1zg4w
Ответить
Для добавления комментариев надо войти в систему.
Если Вы ещё не зарегистрированы на сайте, то сначала зарегистрируйтесь.