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
.