【发布时间】: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 非常陌生,因此将不胜感激任何帮助或朝着正确方向轻推。