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

Я пытаюсь докеризировать приложение 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.

Стоит ли изучать PHP в 2023-2024 годах?
Стоит ли изучать PHP в 2023-2024 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
3
0
22
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Я нашел решение для того же. На самом деле, запуск из 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

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

Другие вопросы по теме