Django + NGINX只提供一些静态文件

时间:2018-04-16 17:48:55

标签: django nginx static

这可能是第100万张django + nginx帖子,但由于我在这里超过5小时没有找到答案,所以它会:

我的问题是并非所有静态文件都可以提供,只有一些。整个事情在我运行的Docker里运行

RUN python manage.py collectstatic --noinput;
RUN python manage.py makemigrations;
RUN python manage.py migrate;

在每次启动时,但它不会提供我的新.js和.css文件,尽管它们与旧文件位于相同的目录中。

我也看到了消息:

132 static files copied to '/static'.

以上是那里复制的文件列表,包括新文件。

项目结构:

/djangoapp
  /app
    /static
      /css
      /js
  /django
  /Dockerfile
/docker-compose

settings.py:

DEBUG = False
STATIC_URL = '/static/'
STATIC_ROOT = '/static'

nginx.conf:

upstream web {  
  ip_hash;
  server web:8000;
}

server {

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

    location / {
        proxy_connect_timeout   3600;
        proxy_send_timeout      3600;
        proxy_read_timeout      3600;
        proxy_pass http://web/;
    }
    listen 8000;
    server_name localhost;
}

为什么不提供所有静态文件?

编辑:

Dockerfile:

FROM python:3.6.4-onbuild
RUN mkdir /config;
RUN mkdir /src;  
COPY . /src
WORKDIR /src 
RUN python manage.py collectstatic --noinput;
RUN python manage.py makemigrations;
RUN python manage.py migrate;
RUN chmod 775 -R /static
#this shows that the new files reside with the others in  the same directory
RUN ls -R /static/ 
CMD gunicorn WebInterface.wsgi -b 0.0.0.0:8000 --timeout 3600

搬运工-compose.yml:

version : '3'

services:
web:
  build: ./WebInterface
  container_name: WebDocker
  volumes: 
    - static-content:/static
  expose:
    - "80"

nginx:
  image: nginx:1.12.2
  container_name: NGINXDocker
  ports:
  - "8000:8000"
  volumes:
    - ./WebInterface:/src
    - ./config/nginx:/etc/nginx/conf.d/
    - static-content:/static
  depends_on:
    - web

volumes:
  static-content:

2 个答案:

答案 0 :(得分:1)

好的,有了额外的信息,我想我知道发生了什么。 你运行你的python脚本来生成静态文件(我假设它)。在运行时,您将挂载目录,因此它将覆盖静态目录中的所有内容。 要么不挂载它,要么添加脚本

python manage.py collectstatic --noinput;
python manage.py makemigrations;
python manage.py migrate;

在入口点(https://docs.docker.com/engine/reference/builder/#entrypoint

此外,将静态安装到nginx容器中没有任何作用,因为您只是反向代理到django容器而没有提供根路径。或者,如果它确实有些重合,我不确定它是否会在启动时获得新生成的文件。

希望这会有所帮助,当我开始使用docker时,有很多乐趣......

答案 1 :(得分:0)

现在的解决方法是在本地计算机上创建静态文件夹,然后将文件传输到docker-compose中的所需位置。

当我找到一个真正的解决方案时,为什么收集静态在docker中不起作用我将更新此

编辑:LevinM提供的解决方案

更新了Dockerfile(由于' onbuild'参数,这只提供了来自requirements.txt的图像和安装python库):

FROM python:3.6.4-onbuild

更新了docker-compose.yml:

version : '3'

services:

    web:
      build: ./WebInterface
      entrypoint: bash -c  "python manage.py collectstatic --noinput &&  python manage.py makemigrations && python manage.py migrate &&  gunicorn WebInterface.wsgi -b 0.0.0.0:8000 --timeout 3600";
      container_name: WebDocker
      volumes: 
        - ./WebInterface:/src
        - static-content:/static
      expose:
        - "80"

    nginx:
      image: nginx:1.12.2
      container_name: NGINXDocker
      ports:
      - "8000:8000"
      volumes:
        - ./WebInterface:/src
        - ./config/nginx:/etc/nginx/conf.d/
        - static-content:/static
      depends_on:
        - web

volumes:
  static-content: