gpt4 book ai didi

django - 如何使用 django docker nginx 和 postgresql 使静态文件工作,因为它不为它们提供服务

转载 作者:行者123 更新时间:2023-12-04 15:02:18 31 4
gpt4 key购买 nike

当我尝试访问 http://127.0.0.1:8000/admin ,我明白了。
enter image description here
我的文件夹结构是:

django-react-nginx
|
|_ _ docker-compose.yml
|
> backend
|
|_ Dockerfile
|
|_ entrypoint.sh

> languages
|
|_ settings.py
> media
> static # This folder appears after running docker-compose -d --build
> nginx
|
|_ default.conf
|
|_ Dockerfile
现在
这是文件
姜戈
设置.py
DEBUG = True

ALLOWED_HOSTS = ['*']

STATIC_URL = '/static/'

STATIC_ROOT = os.path.join(BASE_DIR, 'static')

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

MEDIA_URL = '/media/'

Docker 文件
FROM python:3.8

ENV PYTHONDONTWRITEBYTECODE 1
ENV PYTHONUNBUFFERED 1

WORKDIR /backend

COPY requirements.txt /backend/

RUN pip install -r requirements.txt && \
pip install --upgrade pip

COPY ./entrypoint.sh /

ENTRYPOINT ["sh", "/entrypoint.sh"]

入口点.sh
#!/bin/sh

python manage.py migrate --no-input

python manage.py collectstatic --no-input

gunicorn languages.wsgi:application --bind 0.0.0.0:8000

nginx
默认配置文件
upstream django {
server backend:8000;
}

server {
listen 80;

location / {
proxy_pass http://django;
}

location /static/ {
autoindex on;
alias /backend/static;
}

location /media/ {
autoindex on;
alias /backend/static;
}

}
文件
FROM nginx:1.19.8-alpine

COPY ./default.conf /etc/nginx/conf.d/default.conf

根文件夹
Docker-compose
version: "3.7"

services:
backend:
build: ./backend/languages
stdin_open: true # interactive
tty: true # interactive
restart: "on-failure"
env_file:
.env
volumes:
- ./backend/languages:/backend
- ./backend/languages/static:/backend/static
ports:
- 8000:8000
networks:
- nginx_network
- db_network
depends_on:
- db
db:
image: postgres:11
restart: "on-failure"
environment:
- POSTGRES_DB=postgres
- POSTGRES_USER=postgres
- POSTGRES_PASSWORD=postgres
volumes:
- postgres_data:/var/lib/postgresql/data/
networks:
- db_network

nginx:
build: ./nginx
restart: always
volumes:
- ./backend/languages:/backend
- ./backend/languages/static:/static
ports:
- 80:80
networks:
- nginx_network
depends_on:
- backend

networks:
nginx_network:
driver: bridge
db_network:
driver: bridge

volumes:
postgres_data:

如上所述,我不知道如何使静态文件工作,它们被复制到上面提到的文件夹中,因为当我可以看到创建的文件夹并检查日志时,我得到这个 165 static files copied to '/backend/static'.

最佳答案

Nginx 配置
Nginx 配置看起来不错。容器映射到 /backend/languages/static/static并且别名指向容器内的同一文件夹 - /static .
配置文件

location /static/ {
autoindex on;
alias /static;
}
更新 检测到问题:别名必须具有相同的结束斜杠才能正常工作。所以它必须是 alias /static/nginx 在 compose 中
  nginx:
...
volumes:
- ./backend/languages:/backend
- ./backend/languages/static:/static
Django 配置
但是 Django 配置看起来坏了。在这里,您已配置将静态收集到 static文件夹内 BASE_DIR设置.py
STATIC_ROOT = os.path.join(BASE_DIR, 'static')
MEDIA_ROOT = os.path.join(BASE_DIR, 'media')
而这正是 collectstatic正在向您报告: 165 static files copied to '/backend/static'文件位于 /backend/static , 不是 /static .但是容器配置为根文件夹 /static :
django 在撰写中
  backend
...
volumes:
- ./backend/languages:/backend
- ./backend/languages/static:/static
看起来这个问题可以通过指向来解决
    volumes:
- ./backend/languages/static:/backend/static
尽管如此,仍有一些工作要做:媒体文件也不应该由 Django 提供服务器,因此建议将 Nginx 配置为也提供媒体文件。
Django Dockerfile
我相信映射 ./backend/languages:/backend有效,但是 dockerizing 有什么意义呢?这个 docker 镜像中没有应用程序,只有依赖项。在镜像中包含源是“更好的”,因此最终部署只需要更新镜像和重启容器。
所以,作为旁注,我建议(至少尝试):
  • 使用 nginx 更新服务器媒体文件的配置
  • 在 docker 镜像中包含 django 应用程序源
  • 在构建期间收集静态文件,而不是将它们包含在 docker 镜像中
  • 删除 collectstatic来自 entrypoint
  • 提供静态文件并将它们视为一个单独的产品,如果您要将它们交付到 CDN(一个单独的托管),请考虑使用它们 - 这是一个非常常见的解决方案
  • 当它们仍然在同一个主机上时,继续像现在一样将它们映射到容器,但以“相反”的方式:将静态文件传送到主机文件夹,从 中的容器访问它们ro 模式
  • 关于django - 如何使用 django docker nginx 和 postgresql 使静态文件工作,因为它不为它们提供服务,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/66774079/

    31 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com