2015-11-23 106 views
0

我有一个最小的Django项目,我试图部署到Google App Engine托管虚拟机上。我很难理解到底发生了什么以及发生了什么。我有一个app.yaml文件看起来像这样:Django上App Engine托管虚拟机

runtime: custom 
vm: true 
entrypoint: custom 
api_version: 1 

manual_scaling: 
    instances: 1 

handlers: 
- url: /static 
    static_dir: static 

- url: /.* 
    script: DjangoVM.wsgi.application 

而且看起来像这样一个dockerfile:

FROM gcr.io/google_appengine/python 
RUN apt-get update 
RUN apt-get -y install python-numpy python-scipy 
ADD requirements.txt /app/requirements.txt 
RUN pip install -r /app/requirements.txt 
ADD . /app 
CMD gunicorn DjangoVM.wsgi 

我requirements.txt看起来是这样的:

Django==1.8.5 
gunicorn==19.3.0 
scikit-learn==0.16.1 

的网站部署没问题,但我的静态文件没有显示出来。因此,在沙盒应用引擎项目中,app.yaml中的处理程序负责提供我的静态内容。我需要在我的dockerfile中配置一个nginx服务器或类似的服务器来提供静态内容吗?

为了帮助我理解这一点,如果我没有gunicorn为我的应用程序提供服务,那么默认情况下,App Engine是否不使用处理程序提供服务?即如果我没有CMD gunicorn DjangoVM.wsgi会发生什么?自定义运行时是否意味着应用程序引擎默认不会提供我的应用程序,我必须指定特定的WSGI服务器?这些文档对于托管虚拟机还不是很全面。对不起,如果问题看起来有点混乱,但它反映了我目前对这个问题的困惑。谢谢你的帮助!

回答

0

看起来你在这里混淆了两件事。

有两种部署托管虚拟机的方法:使用标准运行时(在本例中为Python)和使用自定义运行时。

标准运行时基本上是一个App Engine应用程序;像往常一样在app.yaml中定义路线。 runtime值应该是“python27”。但是,您不需要Dockerfile,因此它不包含nginx或gunicorn;这些路由由App Engine运行时提供。

自定义运行时通过给定runtime值“自定义”来定义。这是一个完全自定义的应用程序,由Dockerfile定义。你不要在app.yaml中声明路由,并且它们需要在你的容器中通过正确配置的nginx/gunicorn来提供。

+0

感谢您为我清理。但后续问题。如果我使用标准运行时,是否有办法利用apt-get来利用托管VM环境?我克隆并运行此项目:https://github.com/GoogleCloudPlatform/appengine-scipy-zombie-apocalypse-python(并在我的项目中也使用了相同的方法),但无济于事。 app.yaml中的'vm_settings'似乎没有做任何事情,因为matplotlib没有安装在虚拟机上。我记得在某处看到它被弃用,但不知道替换。 – TowMater7

+0

使用谷歌基础图像FROM gcr.io/google_appengine/python-compat的自定义运行时应该等同于使用python27运行时与托管虚拟机(不需要nginx或gunicorn),我想大多数人都使用它,因为这是唯一的方法通过pip安装额外的软件包。 – dyeray