【问题标题】:Confusion on using docker-compose volumes to serve django static files关于使用 docker-compose 卷来提供 django 静态文件的困惑
【发布时间】:2016-08-11 21:05:10
【问题描述】:

这里是 Docker 新手,尝试使用 Compose 设置一个简单的 Django 项目。我有success with this in the past,但这次我尝试了不同的设置,我不知道为什么它不起作用。

我有以下 docker-compose.yml 文件:

data:
  image: postgres:9.4
  volumes:
    - /var/lib/postgresql
  command: /bin/true

db:
  image: postgres:9.4
  restart: always
  expose:
    - "5432"
  volumes_from:
    - data

app:
  build: .
  restart: always
  env_file: .env
  expose:
    - "8000"
  links:
    - db:db
  volumes:
    - .static:/static_files

web:
  build: docker/web
  restart: always
  ports:
    - "80:80"
  links:
    - app:app
  volumes_from:
    - app

我的 /Dockerfile 是:

FROM python:3.5
ENV PYTHONUNBUFFERED 1

ADD . /app
WORKDIR /app
RUN pip install -r requirements.txt
RUN SECRET_KEY=tmpkey python manage.py collectstatic --noinput

CMD gunicorn mysite.wsgi:application -b 0.0.0.0:8000

我的 /docker/web/Dockerfile 是:

FROM nginx:1.9
RUN rm /etc/nginx/conf.d/default.conf
ADD default.conf /etc/nginx/conf.d/

而我的 /docker/web/default.conf 文件是:

server {
    listen 80 default_server;

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

    location / {
        proxy_pass http://app:8000;
        proxy_set_header Host $host;
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
    }
}

docker 的输出显示静态文件安装到 /static_files,但 nginx 为 /static 下的所有文件返回 404。如果我查看我的 .static 文件夹(在项目的根目录中),该目录是空的(除了我在其中的 .gitkeep 文件)。如果我运行docker-compose app run ls -la /static_files,目录是空的,但docker-compose app run ls -la /app/.static 有.gitkeep 文件。显然,我对 Docker 和 Compose 有误解。对我做错了什么有任何想法吗?我的理解是 RUN SECRET_KEY=tmpkey python manage.py collectstatic --noinput 应该将文件写入我的本地 .static 文件夹,并且 nginx 应该看到这些文件;两者都没有发生。

软件版本:docker-compose 版本 1.7.0,构建 0d7bf73 和 Docker 版本 1.11.0,在 OS X 上构建 4dc5990,docker-machine 连接到云实例。

【问题讨论】:

    标签: django nginx docker docker-compose


    【解决方案1】:

    我仍然不清楚为什么我的原始代码不起作用,但是将我的代码切换为使用 Compose 的 v2 格式是可行的,我在服务之外定义了我的卷。

    这是我更新的 docker-compose.yml 文件:

    version: '2'
    services:
      db:
        image: postgres:9.4
        restart: always
        expose:
          - "5432"
        volumes:
          - postgres-data:/var/lib/postgresql
      app:
        build: .
        restart: always
        env_file: .env
        expose:
          - "8000"
        links:
          - db:db
        volumes:
          - static-data:/static_files
      web:
        build: docker/web
        restart: always
        ports:
          - "80:80"
        links:
          - app:app
        volumes:
          - static-data:/static_files
    volumes:
      postgres-data:
        driver: local
      static-data:
        driver: local
    

    其余配置文件保持不变。

    (值得注意的是,在我运行这个新配置之前,我删除了docker volume ls 中列出的所有现有 Docker 卷——也许这是我的实际修复?)

    【讨论】:

    • 两年后有更新吗?因为这不是正确的做法,因为静态文件应在每次发布后更新,因此您需要关闭卷并每次重新启动。
    • @HRK44 -- 以上需要在每次更新静态文件时重新运行collectstatic。如果您在开发环境中并且希望在开发时更新静态文件,更简单的设置是让 Django 提供静态文件,如Django docs 中所述(从而绕过 Nginx)。如果您在生产中并将静态文件推送到远程服务器,那么这可能会很慢。这是你的抱怨吗?
    • 由于某种原因,我的collectstatic 没有在每次构建后更新卷中的文件。当我深入研究这个问题时,人们说您应该使用构建器生成文件,然后将文件复制到卷中(这是我所做的并且有效)。
    • @HRK44 -- 如果您通过 docker 调用 collectstatic(例如,docker-compose exec django python manage.py collectstatic),这很奇怪。我想你可以先尝试collectstatic --clear 来清除音量,但没有理由这样做会有所帮助(也许除了调试时间戳之外)。无论如何,至少你让它工作了
    • @HRK44 我也有同样的问题。当我收集静态时,它不会更新共享卷。我的共享卷使用本地驱动程序。
    【解决方案2】:

    我偶然发现了这个问题,因为我的静态文件在部署我的 Docker Compose 设置后不会更新。

    删除所有 Docker 卷有所帮助——正如 Dolan 在他的回答末尾所建议的那样。我的静态文件在运行后更新了:

    docker volume prune

    当然这会删除卷及其内容,所以要小心!

    【讨论】:

      猜你喜欢
      • 2019-02-22
      • 2023-03-05
      • 1970-01-01
      • 2019-05-31
      • 1970-01-01
      • 1970-01-01
      • 2023-04-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多