部署到多个服务器时如何管理 Django 应用程序的 collectstatic
How to manage collectstatic for Django app when deploying to multiple servers
我当前的设置:
- 弹性负载均衡器后面的多个 AWS Ec2 实例
- Github
中的 Django 应用程序源代码
- AWS S3 托管我的静态文件
- CodeDeploy 将存储库克隆到新实例上
我正在使用 Docker 在实例上实际构建应用程序。将存储库克隆到实例后,我构建了 docker 映像,在其中 运行 我的 gunicorn 服务器,并将端口 80 请求转发到映像。
我的问题是关于 "collectstatic"。现在,我将 "python manage.py collectstatic" 作为构建步骤之一包含在我的 Docker 文件中。
我面临的问题是 collectstatic 当前在部署期间在每个新实例上 运行,因此重复了工作。当需要将新的静态文件上传到 s3 或需要更新修改后的静态文件时,它也会导致冲突。第一个实例将删除文件并开始复制它,第二个实例将尝试对刚刚删除的文件执行读取操作,并将崩溃并显示 botocore.exceptions.ClientError:发生错误( 404)调用HeadObject操作时:Not Found
我应该如何在部署期间管理更新静态文件?我希望能够 运行 在部署期间仅收集一次静态文件,但不确定如何通过 CodeDeploy 将其与我当前的部署集成,它似乎没有提供任何我可以 运行 自定义脚本的预部署挂钩(CodeDeploy 具有每个实例的挂钩,但这无济于事,因为我需要发生的事情在给定的部署上,而不是在部署期间创建的每个实例上)
如有任何帮助或建议,我们将不胜感激。我确信我的设置存在问题,因此有关在部署期间通常如何处理静态文件的任何信息或指导(当您有多个要部署到的实例时)都将非常有帮助。
我认为你在所有目标 EC2 实例上构建 docker 映像的问题。
更好的 CI/CD 流程是构建一次 docker 映像,然后将映像推送到容器注册表,例如电子信用证。同时将任何静态文件更新推送到 S3。
最后,要在目标 EC2 实例上部署,您只需拉取 docker 映像并 运行 它。
我当前的设置:
- 弹性负载均衡器后面的多个 AWS Ec2 实例
- Github 中的 Django 应用程序源代码
- AWS S3 托管我的静态文件
- CodeDeploy 将存储库克隆到新实例上
我正在使用 Docker 在实例上实际构建应用程序。将存储库克隆到实例后,我构建了 docker 映像,在其中 运行 我的 gunicorn 服务器,并将端口 80 请求转发到映像。
我的问题是关于 "collectstatic"。现在,我将 "python manage.py collectstatic" 作为构建步骤之一包含在我的 Docker 文件中。
我面临的问题是 collectstatic 当前在部署期间在每个新实例上 运行,因此重复了工作。当需要将新的静态文件上传到 s3 或需要更新修改后的静态文件时,它也会导致冲突。第一个实例将删除文件并开始复制它,第二个实例将尝试对刚刚删除的文件执行读取操作,并将崩溃并显示 botocore.exceptions.ClientError:发生错误( 404)调用HeadObject操作时:Not Found
我应该如何在部署期间管理更新静态文件?我希望能够 运行 在部署期间仅收集一次静态文件,但不确定如何通过 CodeDeploy 将其与我当前的部署集成,它似乎没有提供任何我可以 运行 自定义脚本的预部署挂钩(CodeDeploy 具有每个实例的挂钩,但这无济于事,因为我需要发生的事情在给定的部署上,而不是在部署期间创建的每个实例上)
如有任何帮助或建议,我们将不胜感激。我确信我的设置存在问题,因此有关在部署期间通常如何处理静态文件的任何信息或指导(当您有多个要部署到的实例时)都将非常有帮助。
我认为你在所有目标 EC2 实例上构建 docker 映像的问题。
更好的 CI/CD 流程是构建一次 docker 映像,然后将映像推送到容器注册表,例如电子信用证。同时将任何静态文件更新推送到 S3。
最后,要在目标 EC2 实例上部署,您只需拉取 docker 映像并 运行 它。