Выпуск приложения Dockerise Django Cuda с помощью docker compose

Я пытаюсь докеризировать приложение Django Cuda, которое работает на Nginx и Gunicorn.Проблема в том, что когда я иду делать предсказание... я получаю ошибку cuda drivers not found

Мой 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 compose файл

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, когда я пытаюсь собрать dockerfile отдельно, а затем запустить с помощью docker run --rm --gpus all -p 8000:8000 deefakedetectiondockerimage python3 manage.py runserver 0.0.0.0:8000 это работает, но проблема с этим подходом в том, что я не могу обслуживать статический файл в docker. Ngnix требуется для обслуживания статического файла, это означает, что мне нужно запустить это только через docker compose

Я нашел решение для этого. На самом деле, запуск из docker-compose становится сложным, когда вы пытаетесь запустить несколько образов в одном контейнере.

Итак, я собираю образ с помощью DockerFile для приложения и отдельный образ для Ngnix и включаю связь обоих контейнеров с помощью соединений unix socket.

Мой обновленный dockerfile для приложения:

#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

Мой обновленный файл docker для Nginx

FROM nginx
WORKDIR /etc/nginx/
RUN rm /etc/nginx/conf.d/default.conf
COPY nginx.conf /etc/nginx/conf.d
EXPOSE 80

Для пошагового процесса вы можете просмотреть этот блог

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