django - 当我使用 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')
解决方案
推荐阅读
- docker - 在虚拟机中运行 docker 是否会使 dockerized 应用程序可部署在所有虚拟专用服务器上?
- node.js - 调查猴子网络钩子
- jenkins - 使用反斜杠字符会导致 Jenkins 流水线中的错误
- java - Java 时间不同于操作系统时间
- pdf - PhpSpreadsheet 在 XLSX 中有边框,但在 mPDF 类的 PDF 中没有边框
- lldb - 安装 GDB 破坏了 LLDB,我该如何修复 LLDB?
- java - 无向图的Dijkstra算法错误实现
- julia - 在 Julia:BigFloat RoundFromZero 看起来很奇怪
- sass - Sass:根据主题设置全局变量
- hadoop - 创建 dataproc 集群时报告的 DataNode 数量不足