Python Django в Docker - ошибка устройства ввода

Я попытался развернуть свое приложение Django на платформе DigitalOcean App Platform. Из-за использования PyAudio мне пришлось использовать Dockerfile, потому что python3-pyaudio требует "apt-get". Я создал Dockerfile и успешно установил PyAudio. К сожалению, я получил ошибку "OSError: No Default Input Device Available".

Вот мой Dockerfile

# Use the official Python image as the base image
FROM python:3.10-slim

# Set the working directory to /app
WORKDIR /app

# Copy the current directory contents into the container at /app
COPY . /app

# Install any dependencies specified in requirements.txt
RUN pip install --no-cache-dir -r requirements.txt
RUN pip install gunicorn

# Install system dependencies
RUN apt-get update && apt-get install -y \
    apt-utils \
    portaudio19-dev \
    python3-dev \
    gcc

# Install python3.X-pyaudio (adjust X to your Python version)
RUN apt-get install python3-pyaudio

# Install pyaudio for the Python environment
RUN pip install pyaudio

# Expose port 8000 to the outside world
EXPOSE 8000

# Command to run your application
CMD ["gunicorn", "--bind", "0.0.0.0:8000", "--worker-tmp-dir", "/dev/shm", "speechai.wsgi:application"]

Сталкивался ли кто-нибудь с подобной проблемой? К сожалению, я не могу найти никакого решения.

Заранее благодарю за помощь

Я не знаю о вашем приложении, поэтому я создал простой скрипт, чтобы воспроизвести проблему. Он просто воспроизводит WAV-файл. При существующей настройке этот скрипт выдает практически ту же ошибку.

🗎 audio.py

import wave
import sys

import pyaudio

CHUNK = 1024

with wave.open('StarWars3.wav', 'rb') as wf:
    p = pyaudio.PyAudio()

    stream = p.open(format=p.get_format_from_width(wf.getsampwidth()),
                    channels=wf.getnchannels(),
                    rate=wf.getframerate(),
                    output=True)

    while len(data := wf.readframes(CHUNK)):
        stream.write(data)

    stream.close()

    p.terminate()

Создан файл требований для пакетов Python.

🗎 requirements.txt

gunicorn==21.2.0
PyAudio==0.2.14

И сократили конфигурацию Docker.

🗎 Dockerfile

FROM python:3.10-slim

WORKDIR /app

RUN apt-get update && apt-get install -y \
        apt-utils \
        portaudio19-dev \
        python3-dev \
        gcc \
        wget

COPY requirements.txt /app

RUN pip install --no-cache-dir -r requirements.txt

EXPOSE 8000

COPY . /app

# Get some sample audio.
RUN wget -q https://www2.cs.uic.edu/~i101/SoundFiles/StarWars3.wav

CMD ["python3", "audio.py"]

Однако ключевым моментом является то, что вам необходимо предоставить контейнеру доступ к аудиоустройству хоста. Это можно сделать с помощью аргумента --device в docker run.

docker run -it --device /dev/snd ...

При такой настройке вы должны услышать драматические несколько секунд звука.

🚨 Я установил wget для загрузки аудиосэмпла. Вы можете удалить его из Dockerfile.

Вернуться на верх