Я пытаюсь докеризировать приложение Django Cuda, которое работает на Nginx и Gunicorn. Проблема в том, что когда я иду делать прогноз. Я получаю сообщение об ошибке, драйверы cuda не найдены
Мой DockerFile:
FROM nvidia/cuda
FROM python:3.6.8
ENV PYTHONDONTWRITEBYTECODE 1
ENV PYTHONUNBUFFERED 1
WORKDIR /app
COPY ./requirements.txt /app/requirements.txt
RUN python -m pip install --upgrade pip
RUN pip install cmake
RUN pip install opencv-python==4.2.0.32
# RUN pip install pywin32==227
RUN pip install -r requirements.txt
COPY . /app
RUN python manage.py collectstatic --noinput
RUN pip install gunicorn
RUN mkdir -p /home/app/staticfiles/
Ngnix DockerFile
FROM nginx:1.21-alpine
RUN rm /etc/nginx/conf.d/default.conf
COPY nginx.conf /etc/nginx/conf.d
Конфигурационный файл Ngnix
upstream project_settings {
server web:8000;
}
server {
listen 80;
client_max_body_size 0;
location / {
proxy_pass http://project_settings;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header Host $host;
proxy_redirect off;
}
location /static/ {
alias /home/app/staticfiles/;
}
}
Основной файл компоновки Docker
services:
nginx:
build: ./nginx
ports:
- 1300:80
volumes:
- static_volume:/home/app/staticfiles/
depends_on:
- web
web:
build: .
command: gunicorn project_settings.wsgi:application --bind 0.0.0.0:8000
volumes:
- static_volume:/home/app/staticfiles/
image: sampleapp1121asa
expose:
- 8000
deploy:
resources:
reservations:
devices:
- capabilities: [ gpu ]
volumes:
static_volume:
Что-то не работает с docker compose, когда я пытаюсь создать файл docker отдельно, а затем запускаю его с помощью docker run --rm --gpus all -p 8000:8000 deefakedetectiondockerimage python3 manage.py runserver 0.0.0.0:8000
, он работает, но проблема с этим подходом в том, что я не могу обслуживать статический файл в докере. Ngnix требуется для обслуживания статического файла, это означает, что мне нужно запустить его только через docker compose.
Я нашел решение для того же. На самом деле, запуск из docker-compose становится сложным, когда вы пытаетесь запустить несколько образов в одном контейнере.
Поэтому я создаю образ, используя DockerFile для приложения и отдельный образ для Ngnix, и разрешаю связь обоих контейнеров с соединениями сокетов unix.
Мой обновленный файл докеров для приложения:
#pull the nvidia cuda GPU docker image
FROM nvidia/cuda
#pull python 3.6.8 docker image
FROM python:3.6.8
ENV PYTHONDONTWRITEBYTECODE 1
ENV PYTHONUNBUFFERED 1
#create a directory to serve static files
RUN mkdir -p /home/app/staticfiles/app/uploaded_videos/
WORKDIR /app
COPY ./requirements.txt /app/requirements.txt
RUN python -m pip install --upgrade pip
RUN pip install cmake
RUN pip install opencv-python==4.2.0.32
RUN pip install -r requirements.txt
COPY . /app
RUN python manage.py collectstatic --noinput
RUN pip install gunicorn
RUN mkdir -p /app/uploaded_videos/app/uploaded_videos/
VOLUME /app/run/
ENTRYPOINT ["/app/bin/gunicorn_start.sh"]
скрипт gunicorn_start.sh
#!/bin/bash
NAME = "project_settings" # Name of the application
DJANGODIR=/app # Django project directory
SOCKFILE=/app/run/gunicorn.sock # we will communicte using this unix socket
NUM_WORKERS=3 # how many worker processes should Gunicorn spawn
DJANGO_SETTINGS_MODULE=project_settings.settings # which settings file should Django use
DJANGO_WSGI_MODULE=project_settings.wsgi # WSGI module name
echo "Starting $NAME as `whoami`"
# Create the run directory if it doesn't exist
RUNDIR=$(dirname $SOCKFILE)
test -d $RUNDIR || mkdir -p $RUNDIR
# Start your Django Gunicorn
gunicorn project_settings.wsgi:application --bind=unix:$SOCKFILE --workers $NUM_WORKERS --timeout 600
Мой обновленный файл докера для Nginx
FROM nginx
WORKDIR /etc/nginx/
RUN rm /etc/nginx/conf.d/default.conf
COPY nginx.conf /etc/nginx/conf.d
EXPOSE 80
Для пошагового процесса вы можете следовать этому блог