在部署上将静态文件复制到卷上?

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

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

编辑1:是否有一种方法来创build一个“临时卷”,当应用程序部署,这是应用程序被部署时被破坏? 如果是这样,我该怎么做,我怎么让这个卷也提供给nginx?

编辑2:如果我没有错误的select将使用绑定挂载,但我已经读过,应尽可能避免这些应用程序不依赖于主机的文件系统的结构。

 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: 

是的,这是可能的 – 你几乎在那里。 通过将选项--clear传递给collectstatic ,它将在收集静态文件之前清除目录。 这不是你想要的行为。 只需运行它没有标志:

 python manage.py collectstatic --noinput 

而且它应该只复制在目的地还不存在的新的静态文件。

outlook未来,您可能需要考虑为静态文件和媒体文件(用户生成的内容)分开容器,否则会造成混淆,如下所示:)

它似乎是默认的位置docker nginx图像看是/usr/share/nginx/html而不是/data/www如你所愿。

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

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