Bootstrap

Пример использования podman/docker

Пример использования podman/docker

Создадим контейнер в котором будет крутится среда интерпретатора

python, для работы скрипта простенького бота из мессенджера Telegram.

Для чего нужны контейнеры, мне, как и многим будет удобнее понять на подобном примере. Скажу сразу, понятно, что скрипт, пример которого я приведу, можно будет запустить и без docker или podman, создав как обычно виртуальное окружение на своей машине. Но по какой-то неведомой причине, такой скрипт может остановиться, как было у меня, и просто переставать работать. А если мы его запустим со специальными опциями, через созданный образ podman или docker, то в таком случае контейнер перезапустится самостоятельно, и наш скрипт будет активным постоянно, пока мы его не остановим, если это захотим.


Итак, давайте посмотрим как я создам скрипт на языке pyhton, и запущу его в контейнере.

Сначала нужно установить podman или docker на свой компьютер, или на сервер, т.е. на ту машину на которой планируется запустить ваш скрипт. Как это сделать описано здесь: Docker/Podman установка и первый запуск

Итак, когда докер/подман установлен, то создаём каталог, в котором создаём два файла. Файл скрипта который нужно будет запустить в докере, и файл Dockerfile.

Или можете просто склонировать уже готовый проект:


git clone https://gitlab.com/pub_ramanzes/run_telbot_in_docker.git

Содержимое файла 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 и индексируемой прямой ссылкой на сайт (http://itdid.ru)!

Добавляйтесь ко мне в друзья ВКонтакте: http://vk.com/sahroman.
Если Вы хотите дать оценку мне и моей работе, то напишите её в моей группе: http://vk.com/sahroman.

Если у Вас остались какие-либо вопросы, либо у Вас есть желание высказаться по поводу этой статьи, то Вы можете оставить свой комментарий внизу страницы.

Порекомендуйте эту статью друзьям:

Если Вам понравился сайт, то разместите ссылку на него (у себя на сайте, на форуме, в контакте):

  1. Кнопка:

    Она выглядит вот так: Как настроить свой компьютер

  2. Текстовая ссылка:

    Она выглядит вот так: Как настроить свой компьютер

  3. BB-код ссылки для форумов (например, можете поставить её в подписи):

Комментарии (0):

Для добавления комментариев надо войти в систему.
Если Вы ещё не зарегистрированы на сайте, то сначала зарегистрируйтесь.

крипто-донат, на развитие сайта itdid.ru:

В новом окне с терминалом itdid.ru, введите любую сумму: