Django 使用Nginx和uWSGI运行谷歌云的Dockerfile定制

Django 使用Nginx和uWSGI运行谷歌云的Dockerfile定制,django,docker,nginx,dockerfile,google-cloud-run,Django,Docker,Nginx,Dockerfile,Google Cloud Run,我正在尝试将一个Django应用程序从Google Kubernetes引擎迁移到Google Cloud Run,它是完全受管理的。基本上,通过Cloud Run,您可以将应用程序封装到单个Dockerfile中,剩下的工作由Google完成 我有一个Dockerfile,它在某一点上确实通过ENTRYPOINT 但我需要启动Nginx和Gunicorn。Google Cloud Run文档建议像这样启动Gunicorn: CMD gunicorn-b:$PORT foo.wsgi (让我们坐

我正在尝试将一个Django应用程序从Google Kubernetes引擎迁移到Google Cloud Run,它是完全受管理的。基本上,通过Cloud Run,您可以将应用程序封装到单个
Dockerfile
中,剩下的工作由Google完成

我有一个
Dockerfile
,它在某一点上确实通过
ENTRYPOINT

但我需要启动Nginx和Gunicorn。Google Cloud Run文档建议像这样启动Gunicorn:

CMD gunicorn-b:$PORT foo.wsgi

(让我们坐下来,我的Django应用程序名为“foo”)

但我还需要通过以下方式启动Nginx:

CMD[“nginx”、“-g”、“守护进程关闭;”]

由于每个Dockerfile只允许使用一个
CMD
,我不知道如何组合它们

为了克服其中的一些困难,我正在考虑使用Dockerfile来构建一个已经运行的Dockerfile,我遇到了以下问题:

但是路径和我的不太匹配。引用该回购协议的文件:

您不需要克隆GitHub repo。您可以将此图像用作 其他图像的基础图像,在
Dockerfile
中使用:

来自天戈罗/meinheld gunicorn:python3.7

COPY./app/app
它需要一个位于
/app/app/main.py
的文件

并希望它包含一个变量
app
,与您的“WSGI”一起使用 应用程序

我的
wsgi.py
文件以
/app/foo/foo/wsgi.py
结尾,并包含一个名为
application

但如果我正确理解了文件,当它说希望WSGI应用程序命名为app并位于
/app/app/main.py
时,基本上是说我需要修改路径和变量名,这样当它构建映像时,它知道
app
被称为
application
,而不是在
/app/app/main.py
它将在
/app/foo/foo/wsgi.py

我假设我可以通过在我的
wsgi.py
文件中添加一行,比如
app=application
来修复
app
vs
application
变量名,但我不确定如何更正Docker期望的路径

有人能告诉我如何适应我的需要吗


(或任何其他使其工作的方式)

为什么这里需要nginx?我在6个月前开始这个项目时对Kubrenetes和Docker是新手,我发现了一个我们想要安装和运行的容器化应用程序,开发人员使用nginx和uWGSI构建它。Gunicorn似乎比uWSGI更容易配置,所以我切换了,但保留了Nginx,因为使用传统的“服务器”来处理静态资产似乎是明智的……这么简单的回答,它使用Nginx是因为最初的开发人员按照我认为它需要的方式构建它。经验法则是每个容器一个进程,您建议两个(nginx和gunicorn)在这里做同样的工作。如果您发布nginx和gunicorn的配置,我们可以帮助您删除nginx。对于以后遇到此问题的任何人:阅读这些评论并尝试使用建议(甚至尝试实现“init脚本”,如“dumb init”),我得出结论,我想要运行的应用程序,以及我想要的结果,都不适合谷歌云运行……是的,它只会在应用程序正在积极运行时向你收取周期费用(这很有吸引力),但从“冷启动”开始,运行和用户/机器人发出请求将花费不可接受的长时间(有一个匿名的公共表单)会导致应用程序启动add'l实例……我最终会为这些额外实例的处理付费。uWSGI文档(v20.x)非常清楚uWSGI极易受到DDoS攻击,他们强烈建议将其置于Nginx等反向代理之后,因此我认为“弊”大于“利”,主要是因为任何黑客或机器人都可以提交表单并触发我的应用程序运行——即使完成需要90秒,大多数用户都会放弃。因此,如果你的应用程序需要后台处理,或者快速响应,或者可以公开地、匿名地触发,那么你应该明智地考虑其他选项。为什么你需要NGIX?我在6个月前开始这个项目的时候,我是Kubrenetes和DOKER的新手,我发现了一个容器化的应用程序,我们希望它运行起来,开发者开发它。有了Nginx和uWGSI,Gunicorn似乎比uWSGI更容易配置,所以我切换了,但保留了Nginx,因为使用传统的“服务器”似乎是明智的为了处理静态资产等等……这么简单的回答,它使用了Nginx,因为最初的开发人员按照我认为它需要的方式构建了它。经验法则是每个容器一个进程,您建议两个(Nginx和gunicorn)如果你发布你的Nginx和gunicorn配置,我们可以帮助你删除Nginx。对于以后遇到这种情况的人:在阅读这些评论并尝试这些建议之后(甚至尝试实现“dumb init”等“init脚本”),我得出结论,我想要运行的应用程序,以及我想要的结果,都不适合谷歌云运行……是的,它只会在应用程序正在积极运行时向你收取周期费用(这很有吸引力),但从“冷启动”开始,运行和用户/机器人发出请求将花费不可接受的长时间(有一个匿名的公共表单)会导致应用程序启动add'l实例……我最终会为这些额外实例的处理付费。uWSGI文档(v20.x)很明显,uWSGI极易受到DDoS攻击,他们强烈建议将其置于Nginx等反向代理之后,因此我认为“弊”大于“利”,主要是因为任何黑客