【问题标题】:Uploading files to Django + Nginx doesn't save it in the media volume in Docker将文件上传到 Django + Nginx 不会将其保存在 Docker 的媒体卷中
【发布时间】:2022-08-10 07:37:38
【问题描述】:

基本上每当我尝试使用我的网站上传文件时,该文件都不会保存在媒体卷上。

我不认为这是代码问题,因为即使与 nginx 配对,它也可以在没有容器的情况下完美运行。

我按照tutorial 设置了我的 docker 容器。

这是我的 Dockerfile:

# pull official base image
FROM python:3.9.6-alpine

# set work directory
WORKDIR /home/azureuser/ecommerce3

# set environment variables
ENV PYTHONDONTWRITEBYTECODE 1
ENV PYTHONUNBUFFERED 1

# fixing alpine related pip errors
RUN apk update && apk add gcc libc-dev make git libffi-dev openssl-dev python3-dev libxml2-dev libxslt-dev
RUN apk add jpeg-dev zlib-dev freetype-dev lcms2-dev openjpeg-dev tiff-dev tk-dev tcl-dev

# install psycopg2 dependencies
RUN apk update \\
    && apk add postgresql-dev gcc python3-dev musl-dev

# install dependencies
RUN pip install --upgrade pip
COPY ./requirements.txt .
RUN pip install -r requirements.txt

# copy entrypoint.sh
COPY ./entrypoint.sh .
RUN sed -i \'s/\\r$//g\' ./entrypoint.sh
RUN chmod +x ./entrypoint.sh


# copy project
COPY . .

# running entrypoint.sh
ENTRYPOINT [\"./entrypoint.sh\"]

 

码头工人-compose.yml:

version: \'3.8\'

services:
  web:
    build:
      context: ./
      dockerfile: Dockerfile
    command: sh -c \"cd DVM-Recruitment-Task/ && gunicorn DVM_task3.wsgi:application --bind 0.0.0.0:8000\"
    volumes:
      - static_volume:/home/azureuser/ecommerce3/staticfiles:Z
      - media_volume:/home/azureuser/ecommerce3/mediafiles:Z
      - log_volume:/home/azureuser/ecommerce3/logs
    expose:
      - 8000
    depends_on:
      - db
  db:
    image: postgres:13.0-alpine
    volumes:
      - postgres_data:/var/lib/postgresql/data/
    environment:
      - POSTGRES_USER=---
      - POSTGRES_PASSWORD=---
      - POSTGRES_DB=---
  nginx:
    image: nginx
    ports:
      - 80:80
      - 443:443
    restart: always
    volumes:
      - ./nginx/DVM_task3:/etc/nginx/conf.d/default.conf
      - static_volume:/home/azureuser/ecommerce3/staticfiles/:Z
      - media_volume:/home/azureuser/ecommerce3/mediafiles/:Z
      - log_volume:/home/azureuser/ecommerce3/logs
      - (ssl certificate stuff here)
   volumes:
      postgres_data:
      media_volume:
      static_volume:
      log_volume:

 

入口点.sh:

#!/bin/sh

if [ \"$DATABASE\" = \"postgres\" ]
then
    echo \"Waiting for postgres...\"

    while ! nc -z $SQL_HOST $SQL_PORT; do
      sleep 0.1
    done

    echo \"PostgreSQL started\"
fi
python DVM-Recruitment-Task/manage.py makemigrations ecommerce
python DVM-Recruitment-Task/manage.py migrate --noinput
python DVM-Recruitment-Task/manage.py collectstatic --no-input --clear
exec \"$@\"

 

我的 nginx 文件也已经在服务器块中有这个

location /media/ {
        autoindex on;
        alias /home/azureuser/ecommerce3/mediafiles/;
    }

 

settings.py 有这个:

MEDIA_URL = \'/media/\'
MEDIA_ROOT = \'mediafiles\'

 

urls.py 中已经有这一行

urlpatterns[...] + static(settings.MEDIA_URL, document_root=settings.MEDIA_ROOT)

 

我的项目结构也看起来像这样:

.
├── DVM-Recruitment-Task
│  ├── DVM_task3
│  ├── README.md
│  ├── ecommerce
│  ├── manage.py
│  ├── static
│  └── templates
├── Dockerfile
├── docker-compose.yml
├── entrypoint.sh
├── nginx
│  └── DVM_task3
└── requirements.txt

名为 \'ecommerce3\' 的目录中的所有内容。

 

媒体文件、静态文件和日志卷应该在同一目录 (ecommerce3) 中创建。

在运行 --collectstatic 时,静态文件正确加载,日志也可以正常工作,但媒体文件不会保存到 mediafiles 文件夹中。

如果我进入 web 容器的 shell 并在 mediafiles 目录中手动创建一个文件,我可以在 /media url 中查看,所以我认为 nginx 指向正确的方向。但是,在保存文件时,文件永远不会保存在此卷上。

我对 django 和 docker 非常陌生,因此将不胜感激任何帮助或朝着正确方向轻推。

    标签: django docker nginx


    【解决方案1】:

    尝试创建媒体文件dockerfile 中的文件夹

    RUN mkdir $APP_HOME/mediafiles
    

    在哪里$APP_HOME是您的应用所在的位置:/home/azureuser/ecommerce3

    【讨论】:

      猜你喜欢
      • 2021-10-09
      • 2021-04-17
      • 2016-02-21
      • 1970-01-01
      • 2023-03-26
      • 1970-01-01
      • 2020-07-15
      • 2016-04-14
      • 2019-07-21
      相关资源
      最近更新 更多