How to run django with apache in a docker container correctly

Issue

So I’m been trying to dockerized my Django app with apache on a container and I keep getting this error
Invalid command 'WSGIProcessGroup', perhaps misspelled or defined by a module not included in the server configuration

I tried to install mod_wsgi with apt and pip but the result was still the same

Here is my Dockerfile

FROM httpd:2.4

ADD ./requirements.txt ./
RUN apt-get update \
&& apt-get install -y \
python3-pip python3-venv \
libapr1 libapr1-dev \
libaprutil1-dev \
libapache2-mod-wsgi \
&& python3 -m venv /.cp \
&& /.cp/bin/pip install --no-cache-dir -r requirements.txt \
&& rm -rf /var/lib/apt/lists/*

The requirements.txt

django
mod-wsgi
psycopg2-binary
djangorestframework
markdown
django-filter

my custom vhost file

<VirtualHost *:80>
    serverAdmin [email protected]
    DocumentRoot "/usr/local/apache2/htdocs/webapp"
    Servername www.webapp.io
    ServerAlias webapp.io
    ErrorLog "/var/log/apache2/error.log"
    CustomLog "/var/log/apache2/access.log" combined
    Alias /static /capstone/static
    <Directory "/usr/local/apache2/htdocs/webapp/static">
        Require all granted
        AllowOverride None
    </Directory>
    <Directory "/usr/local/apache2/htdocs/webapp/webapp">
        <Files wsgi.py>
            AllowOverride None
            Require all granted
        </Files>
    </Directory>
    WSGIProcessGroup webapp_project
    WSGIDaemonProcess webapp_project python-path=/webapp python-home=/.env
    WSGIScriptAlias / /usr/local/apache2/htdocs/webapp/webapp/wsgi.py
</VirtualHost>

And this is my docker compose file

version: '2'
services:
        postgres:
                image: postgres:13.1-alpine
                environment:
                        POSTGRES_USER: postgres
                        POSTGRES_PASSWORD: postgres
                        POSTGRES_DB: parking
                restart: always
                container_name: db
        apache:
                build : ./Django
                image: web:1.0
                container_name: web
                ports:
                        - "8080:80"
                volumes:
                        - ./my-httpd.conf:/usr/local/apache2/conf/httpd.conf
                        - ./Django/web.conf:/usr/local/apache2/conf/extra/httpd-vhosts.conf
                        - ./Django/web:/usr/local/apache2/htdocs/my-web
networks:
        default:
                external:
                        name: network 

At first my initial idea was to have 3 containers, one for postgres, the second for django and the third for apache. But after many fail attemps, I just go with 2 containers one for postgres and the other for generating virtualenv, django app and apache. Any help would be great, thank you

Solution

what you did is right but it missing some custom things :

  1. First of all you need to link your django static file to the apache web server and to do that you need to add a service on your docker-compose.yml for the django part .

after that using volume you can link the django output as an input for apache

For more details thanks to follow this example

Answered By – rassakra

This Answer collected from stackoverflow, is licensed under cc by-sa 2.5 , cc by-sa 3.0 and cc by-sa 4.0

Leave a Reply

(*) Required, Your email will not be published