Запуск 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?)