我目前的设置:
- 弹性负载均衡器后面的多个 AWS Ec2 实例
- Github 中的 Django 应用程序源代码
- AWS S3 托管我的静态文件
- CodeDeploy 将存储库克隆到新实例上
我正在使用 Docker 在实例上实际构建应用程序。将存储库克隆到实例后,我构建 docker 映像,在其中运行我的 gunicorn 服务器,并将端口 80 请求转发到映像。
我的问题是关于“collectstatic”的。现在,我在 Dockerfile 中包含“python manage.py collectstatic”作为构建步骤之一。
我面临的问题是, collectstatic 当前在部署期间在每个新实例上运行,因此重复了工作。当需要将新的静态文件上传到 s3 或需要更新修改的静态文件时,也会导致冲突。一个实例将删除文件并开始将其复制,第二个实例将尝试对刚刚删除的文件执行读取操作,并会因botocore.exceptions.ClientError: An error occurred (404) 调用HeadObject 操作:未找到
我应该如何在部署期间管理更新静态文件?我希望能够在部署期间只运行一次 collectstatic,但不确定如何通过 CodeDeploy 将其与我当前的部署集成,这似乎没有提供任何可以运行自定义脚本的预部署挂钩(CodeDeploy 有每个实例挂钩,但这无济于事,因为我需要在给定部署上发生的事情,而不是在部署期间创建的每个实例上)
任何帮助或建议将不胜感激。我确信我的设置有问题,因此任何有关在部署期间通常如何处理静态文件的信息或指导(当您有多个要部署的实例时)都会非常有帮助。