【问题标题】:Copy static files to volume on deployment?在部署时将静态文件复制到卷?
【发布时间】:2017-09-18 11:09:16
【问题描述】:

如何确保在部署期间创建的最新静态文件 一个 Django 应用程序被复制到一个卷中?我的web 容器定义了一个 Django 应用程序,该应用程序在构建时运行python manage.py collectstatic --noinput --clear。这会将所有静态文件移动到/usr/src/app/static_files 目录中。我希望这些静态文件在staticdata 卷中可用,以便 nginx 可以为它们提供服务。换句话说,/usr/src/app/static_files 的内容应该覆盖staticdata 卷中现有文件的内容。否则 nginx 将继续提供文件的旧副本,例如 css 文件和图像,而不是 Django 收集的更新文件。

这可能吗?感觉就像我为此目的使用错误的卷,因为它们的目的是持久化数据。

Edit1:有没有办法在应用程序部署时创建一个“临时卷”,在取消部署应用程序时将其销毁?如果是这样,我该怎么做,如何让这个卷也可用于 nginx?

Edit2:如果我没记错的话,一个选项是使用绑定挂载,但我已经读过,如果可能的话,应该避免这些,这样应用程序就不会依赖于主机的文件系统。

version: '3.3'

services:
  web:
    restart: always
    build: ./web
    env_file:
    - web-variables.env
    expose:
      - "8000"
    ports:
      - "8000:8000"
    volumes:
      - staticdata:/usr/src/app/static_files
      - staticdata:/usr/src/app/uploaded_files
    command: "./django-entrypoint.sh"
    depends_on:
      - database

  nginx:
    restart: always
    build: ./nginx
    ports:
      - "80:80"
      - "443:443"
    volumes:
      - staticdata:/data/www
    depends_on:
      - web

  database:
    image: postgres:9.2
    restart: always
    volumes:
      - pgdata:/var/lib/postgresql/data
    ports:
      - "5432:5432"

volumes:
  staticdata:
  pgdata:

【问题讨论】:

    标签: django docker docker-compose


    【解决方案1】:

    是的,有可能——你就快到了。通过将选项--clear 传递给collectstatic,它将在收集静态文件之前清除目录。这不是你想要的行为。只需在没有该标志的情况下运行它:

    python manage.py collectstatic --noinput
    

    并且它应该只复制目的地尚不存在的较新的静态文件。

    展望未来,您可能需要考虑为静态文件和媒体文件(用户生成的内容)提供单独的容器,否则事情可能会变得混乱,如下所示:)

    【讨论】:

    • 我听从了你的建议,把容器分开了。但是,除非我做错了什么,否则在更新静态文件(例如style.css)并重新部署应用程序时,较新的副本不会覆盖卷中已经存在的文件。这些感染了 Django 静态文件的相反语义:卷中的文件应该完全丢弃,以支持 Django 收集的新文件。
    【解决方案2】:

    看起来docker nginx 图像的默认位置是/usr/share/nginx/html,而不是您想要的/data/www

    所以只要改变这一行,它应该可以工作:

     nginx:
        ...
          - staticdata:/usr/share/nginx/html
        ...
    

    【讨论】:

    • 如果我的问题不清楚,我深表歉意。我的静态文件服务正确(即目录配置正确),但 Django 在每次部署时收集的静态文件需要覆盖 staticdata 卷中已有的文件。否则,旧的 css、图像等将提供给用户,而不是 Django 应用程序中的更新文件。
    • 好的,很抱歉造成误解。我认为命令或docker-compose.yml 没有任何问题。如果它不复制它可能是你的 Django 设置。所以你可以试着先用输入运行它,看看它是否像docker-compose run --rm web ./manage.py collectstatic一样正确复制。如果它也不起作用,那么您的 Django 设置的 STATIC_ROOT 可能是错误的
    • 如果我没记错的话,/usr/src/app/static_files 中的数据仅被复制以使用容器中的数据(即创建时)预填充卷。否则不写入数据。这是有道理的,因为我确信 Django 正确地收集了 /usr/src/app/static_files 中的静态文件,而卷仍然包含旧文件。不幸的是,我找不到明确说明行为的文档部分,但 here 它只说“容器可以预先填充新卷的内容。”
    猜你喜欢
    • 2018-03-18
    • 1970-01-01
    • 1970-01-01
    • 2019-05-15
    • 1970-01-01
    • 2021-03-03
    • 2021-08-22
    • 1970-01-01
    • 2020-05-19
    相关资源
    最近更新 更多