首页 > 解决方案 > 当我使用 docker 和 nginx 在服务器上部署时,django 项目中的动态媒体出现问题

问题描述

我上传到 django-admin 的图像有问题。照片被添加到正在运行的容器中的媒体文件夹中,但似乎照片正试图从它们不存在的本地文件中获取。全部在我自己的计算机上工作,但是当我尝试在服务器上部署时遇到了这个问题

这就是它在站点中的外观 在 此处输入图像描述

nginx找不到它 在此处输入图像描述

我已经尝试过类似这样的Django 静态文件,但它不适用于Docker

这是我的文件结构:

booking2
  assets
  media
  main-app
  booking2
  docker
   nginx
    Dockerfile
    nginx.conf
 docker-compose.yml
 Dockerfile
 entrypoint.sh
 .env

主 Dockerfile

FROM python:3.8-alpine

ENV PYTHONDONTWRITEBYTECODE 1
ENV PYTHONUNBUFFERED 1

WORKDIR /app

RUN apk --update add
RUN apk add gcc gcc python3-dev libc-dev libffi-dev jpeg-dev zlib-dev libjpeg libxml2-dev libxml2 libxslt-dev gettext
RUN apk add postgresql-dev

RUN pip install --upgrade pip

COPY ./requirements.txt .
RUN pip install -r requirements.txt


COPY . .
RUN chmod +x entrypoint.sh
ENTRYPOINT ["/app/entrypoint.sh"]

码头工人-compose.yml

version: "3.7"


services:
  web:
    build:
      context: .
      dockerfile: Dockerfile
    ports:
      - "8000:8000"
    entrypoint:
      - ./entrypoint.sh
    depends_on:
      - postgresdb

  postgresdb:
    build:
      context: ./docker/postgres
      dockerfile: Dockerfile
    environment:
      - POSTGRES_PASSWORD=devpass
    volumes:
      - ./docker/postgres/init.sql:/docker-entrypoint-initdb.d/init.sql
    ports:
      - "5432:5432"
  nginx:
    build:
      context: ./docker/nginx
      dockerfile: Dockerfile
    ports:
      - "80:80"
      - "443:443"
    depends_on:
      - web
      - postgresdb
    volumes:
      - ./assets/:/assets
      - ./media/:/media

入口点.sh

#!/usr/bin/env sh


python manage.py makemigrations --no-input
python manage.py migrate --no-input
python manage.py collectstatic --no-input

gunicorn booking2.wsgi:application --bind 0.0.0.0:8000 --reload -w 4

Nginx Dockerfile

FROM nginx:1.19.0-alpine
        
RUN rm /etc/nginx/conf.d/default.conf
        
COPY nginx.conf /etc/nginx/conf.d

Nginx 配置文件

upstream web {
        server web:8000;
    }
    
    server {
        listen 80;
        server_name localhost;
        
        
    location / {
        proxy_pass http://web;
        proxy_redirect off;
        proxy_set_header Host $http_host;
        proxy_set_header X-Forwarded-for $proxy_add_x_forwarded_for;
    }
    location /assets/ {
        alias /assets/;
    }
    location /media/ {
        alias /media/;
    }
   }

这是我的媒体设置

MEDIA_URL = '/media/'
MEDIA_ROOT = os.path.join(BASE_DIR, 'media')

标签: djangodockernginxdocker-compose

解决方案


推荐阅读