0

我目前的设置:

  • 弹性负载均衡器后面的多个 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 有每个实例挂钩,但这无济于事,因为我需要在给定部署上发生的事情,而不是在部署期间创建的每个实例上)

任何帮助或建议将不胜感激。我确信我的设置有问题,因此任何有关在部署期间通常如何处理静态文件的信息或指导(当您有多个要部署的实例时)都会非常有帮助。

4

1 回答 1

0

我认为您在所有目标 EC2 实例上构建 docker 映像的问题。

更好的 CI/CD 流程是您构建一次 docker 映像,然后将映像推送到容器注册表,例如 ECR。还将任何静态文件更新推送到 S3。

最后,要在目标 EC2 实例上部署,您只需拉取 docker 映像并运行它。

于 2020-05-22T22:56:29.687 回答