Переместите мое приложение Django + Apache в Docker

Я пытаюсь перенести мое тестовое приложение на Docker, но я всегда получаю одну и ту же ошибку, несмотря на то, что пробовал множество подходов.

Это мой Dockerfile:

FROM python:3.10-slim-buster

RUN apt-get update && apt-get install -y apache2 libapache2-mod-wsgi-py3
WORKDIR /app
COPY requirements.txt /app/
RUN pip install -r requirements.txt
COPY morabusa /app/
COPY app.conf /etc/apache2/sites-available/app.conf
RUN a2dissite 000-default.conf && a2ensite app.conf
CMD ["/usr/sbin/apache2ctl", "-D", "FOREGROUND"]

Вот app.conf для Apache vHost, который я сильно упростил, чтобы попытаться найти проблему:

<VirtualHost *:80>

    ServerName morabusa.com

    ErrorLog /app/morabusaprj/logs/error.log                                                   
    CustomLog /app/morabusaprj/logs/access.log combine

    <Directory /app>                                                                                               
            Require all granted
    </Directory>

    WSGIScriptAlias / /app/morabusaprj/wsgi.py

</VirtualHost>

Вот моя конфигурация файла wsgi.py (я добавил import sys, но все равно ничего не получается):

import os
import sys

sys.path.append('/app')
sys.path.append('/app/morabusaprj')

from django.core.wsgi import get_wsgi_application

os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'morabusaprj.settings')

application = get_wsgi_application()

Traceback:

[Wed Feb 08 17:57:56.488523 2023] [wsgi:error] [pid 9:tid 140315142702848] [client 192.168.1.33:60062] mod_wsgi (pid=9): Failed to exec Python script file '/app/morabusaprj/wsgi.py'.
[Wed Feb 08 17:57:56.488574 2023] [wsgi:error] [pid 9:tid 140315142702848] [client 192.168.1.33:60062] mod_wsgi (pid=9): Exception occurred processing WSGI script '/app/morabusaprj/wsgi.py'.
[Wed Feb 08 17:57:56.488622 2023] [wsgi:error] [pid 9:tid 140315142702848] [client 192.168.1.33:60062] Traceback (most recent call last):
[Wed Feb 08 17:57:56.488633 2023] [wsgi:error] [pid 9:tid 140315142702848] [client 192.168.1.33:60062]   File "/app/morabusaprj/wsgi.py", line 17, in <module>
[Wed Feb 08 17:57:56.488635 2023] [wsgi:error] [pid 9:tid 140315142702848] [client 192.168.1.33:60062]     from django.core.wsgi import get_wsgi_application
[Wed Feb 08 17:57:56.488644 2023] [wsgi:error] [pid 9:tid 140315142702848] [client 192.168.1.33:60062] ModuleNotFoundError: No module named 'django'

Дело в том, что django установлен в контейнере правильно, но почему-то он все равно выдает ту же ошибку.

У меня есть ощущение, что это что-то связанное с тем, что wsgi не использует правильную версию python, но я не уверен, как решить эту проблему. Несмотря на установку python3.10, я все еще вижу python3.7, установленный в контейнере.

root@fd5605c69de5:/app/morabusaprj/logs# whereis python

python: /usr/bin/python3.7m /usr/bin/python3.7 /usr/lib/python3.7 /etc/python3.7 /usr/local/bin/python /usr/local/bin/python3.10-config /usr/local/bin/python3.10 /usr/local/lib/python3.10 /usr/local/lib/python3.7

python не имеет пути к вашим сайт-пакетам. Вы можете добавить путь к tequires в wsgi.py. Что-то вроде:

replacement for WSGIPythonHome "d:/..../django_project/env_folder"
# choose one:
sys.path.append('d:/.../env_folder/lib/site-packages')              # add individual virt.environment packages at the end of sys.path;  global env packages have prio
sys.path.insert(0,'d:/.../env_folder/lib/site-packages')            # add individual virt.environment packages at the beginning of sys.path;  indiv. virt.env packages have prio over global env
    
# replacement   WSGIPythonPath "d:/..../django_project/app_name"    
sys.path.append('d:/.../django_project/app_name')

просто нужно узнать путь в вашей установке python в контейнере

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