Запуск Django + Postgresql + Gunicorn в контейнере Docker с помощью compose - ошибки разрешения файлов

Я использую Docker-desktop версии 20.10.16 на Ubuntu 20.0.4 LTS

Я хочу установить Django (v3.2), PostgreSQl (v14.3) и Gunicorn (v20.1.0) в один контейнер. И использовать эти контейнеры в качестве виртуальных хостов, обслуживаемых одним экземпляром Nginx, который запущен на моей локальной машине.

Я могу создать образы и контейнер, но установка приложения django не удается из-за ошибки создания/записи файла myporoj.log. В настоящее время я не использую nginx в качестве прокси-сервера для виртуальных хостов - я хочу сначала решить эту проблему, прежде чем переходить к использованию Nginx в моей установке.

Вот дополнительные важные детали:

Моя файловая структура (на локальной машине) выглядит следующим образом:

/path/to/myprojectweb/
            /myproj
               /myproj
               settings.py 
               wsgi.py
               # etc.
           Dockerfile.prod
           compose.prod.yml

Dockerfile.prod.yml

# Builder Image

FROM python:3.8-slim-buster as Builder


WORKDIR /usr/src/app


ENV PYTHONUNBUFFERED 1
ENV PYTHONDONTWEITEBYTECODE 1


RUN apt-get update && apt-get install -y \
    build-essential \
    libpq-dev
  

RUN pip install --upgrade pip pipenv
COPY Pipfile* ./
RUN pipenv lock --keep-outdated --requirements > requirements.txt \
    && pip wheel --no-cache-dir --no-deps --wheel-dir /usr/src/app/wheels -r requirements.txt


# Final Image

FROM python:3.8-slim-buster

RUN mkdir -p /home/app  /var/log/gunicorn

# create user + group app that apps will run as.
RUN groupadd -r app && useradd --no-log-init -r -g app app

ENV HOME=/home/app
ENV APP_HOME=/home/app/web
RUN mkdir $APP_HOME
WORKDIR $APP_HOME


RUN apt-get update && apt-get install -y libpq-dev
COPY --from=builder /usr/src/app/wheels /wheels
COPY --from=builder /usr/src/app/requirements.txt ./

RUN chown -R app:app $HOME
RUN chown -R app:app $APP_HOME && chmod ug+rws $APP_HOME
RUN chown -R app:app /var/log/gunicorn

# change user before install, so 3rd party packages can be updated with makemigrations/migrate
USER app
RUN pip install --no-cache /wheels/*

COPY . $APP_HOME

compose.prod.yml

services:

  db:
    image: postgres:14.3

    restart: always
    container_name: myproj_postgres_db
    env_file:
      - .env

    volumes:
      - postgres_data:/var/lib/postgresql/data/

  # Gunicorn tips from: https://pythonspeed.com/articles/gunicorn-in-docker/
  web:
    build: 
      context: .
      dockerfile: Dockerfile.prod
    container_name: myproj_app
    restart: always
    command: >
      sh -c "python manage.py makemigrations && python manage.py migrate &&
             gunicorn --capture-output \
                      --access-logfile /var/log/gunicorn/access.log  \
                      --error-logfile /var/log/gunicorn/error.log  \
                      --enable-stdio-inheritance  \
                      --workers 3  \
                      --worker-tmp-dir /dev/shm \
                      --bind 0.0.0.0:8000 \
                       myproj.wsgi:application" 
    #--bind unix:/var/log/gunicorn/myproj.sock 
    
    ports:
      - 8000:8000
    env_file:
      - .env

    depends_on:
      - db

volumes:
  postgres_data:      

Вот вывод (фрагмент) следующей команды:

/path/to/mypjo/$ sudo docker compose -f compose.prod.yml up --build

Итак, несмотря на то, что я chmod разрешения для необходимых папок (даже устанавливаю флаг sticky, где это необходимо) - я все еще имею ошибки разрешения файлов, и Gunicorn также ругается, что не находит wsgi.py

Как мне исправить ошибку разрешения файла, а также заставить gunicorn запуститься (используя данные конфигурации, которые я передаю ему через флаги CL?)

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