Cannot run Google App Engine custom managed VM: --custom-entrypoint must be set error
Question: **PROBLEM DESCRIPTION**

I am trying to create a custom managed VM for Google App Engine that behaves
identically to the standard python27 managed VM provided by Google. (I'm doing
this as a first step to adding a C++ library to the runtime).

From google [documentation](https://cloud.google.com/appengine/docs/managed-
vms/tutorial/step2#dockerfile), the following Dockerfile specifies the
standard python27 runtime:

    
    
    FROM gcr.io/google_appengine/python-compat
    ADD . /app
    

I have verified that this is the right Dockerfile by examining the one
generated by `gcloud preview app run` when using the standard python27
runtime. It is identical to this.

But when I run my application with this Dockerfile using `dev_appserver.py` or
with `gcloud preview app run` I get an error saying:

    
    
    The --custom_entrypoint flag must be set for custom runtimes
    

I am using the latest versions of gcloud (1.9.86, with app-engine-python
component version 1.9.28) and the standalone python app engine SDK (1.9.28). I
had the same problem with earlier versions, so I updated to the latest.

**THINGS I HAVE TRIED:**

`gcloud preview app run --help` has the following to say about `--custom-
entrypoint`:

    
    
     --custom-entrypoint CUSTOM_ENTRYPOINT
        Specify an entrypoint for custom runtime modules. This is required when
        such modules are present. Include "{port}" in the string (without
        quotes) to pass the port number in as an argument. For instance:
        --custom_entrypoint="gunicorn -b localhost:{port} mymodule:application"
    

I am not sure what to make of this. Should the docker image not already
contain an ENTRYPOINT? Why am I being required to provide one in addition?
Also, what should the entrypoint be for the `gcr.io/google_appengine/python-
compat` image be? Google provides no documentation for this.

I have tried a meaningless `--custom-entrypoint="echo"`, which silences the
error, but the application does not response to any HTTP requests.

The two other relevant stackoverflow questions I have found have not helped.
The accepted answers seem to suggest that this is a bug in the SDK that was
resolved. But I have tried it in two versions of the SDK, including the
latest, and I still have the problem.

  * [How to fix “`The --custom_entrypoint flag must be set for custom runtimes`”?](http://stackoverflow.com/questions/31280849/how-to-fix-the-custom-entrypoint-flag-must-be-set-for-custom-runtimes)
  * [Google Managed VM error - custom entry point](http://stackoverflow.com/questions/33255674/google-managed-vm-error-custom-entry-point)

**STEPS TO REPRORDUCE:**

To highlight my problem, I have created a trivial application that generates
the error. It consists of just three files:

`app.yaml`:

    
    
    module: default
    version: 1
    runtime: custom
    api_version: 1
    threadsafe: true
    vm: true
    
    handlers:
    - url: /.*
      script: wsgi.app
    

`Dockerfile`:

    
    
    FROM gcr.io/google_appengine/python-compat
    ADD . /app
    

This `Dockerfile` is the same one that is used for the python27 runtime (and
in fact literally copy-pasted from the Dockerfile generated by `gcloud preview
app run` when using the python27 runtime), so this should be identical to
setting `runtime: python27`.

`wsgi.py`:

    
    
    import webapp2
    
    class Hello(webapp2.RequestHandler):
        def get(self):
            self.response.write(u'Hello')
    
    app = webapp2.WSGIApplication([('/Hello', Hello)], debug=True)
    

When I run `dev_appserver.py app.yaml` in the directory containing these three
files however, I get the following error:

    
    
    Traceback (most recent call last):
      File "/home/vagrant/google-cloud-sdk/platform/google_appengine/dev_appserver.py", line 83, in <module>
        _run_file(__file__, globals())
      File "/home/vagrant/google-cloud-sdk/platform/google_appengine/dev_appserver.py", line 79, in _run_file
        execfile(_PATHS.script_file(script_name), globals_)
      File "/home/vagrant/google-cloud-sdk/platform/google_appengine/google/appengine/tools/devappserver2/devappserver2.py", line 1033, in <module>
        main()
      File "/home/vagrant/google-cloud-sdk/platform/google_appengine/google/appengine/tools/devappserver2/devappserver2.py", line 1026, in main
        dev_server.start(options)
      File "/home/vagrant/google-cloud-sdk/platform/google_appengine/google/appengine/tools/devappserver2/devappserver2.py", line 818, in start
        self._dispatcher.start(options.api_host, apis.port, request_data)
      File "/home/vagrant/google-cloud-sdk/platform/google_appengine/google/appengine/tools/devappserver2/dispatcher.py", line 194, in start
        _module.start()
      File "/home/vagrant/google-cloud-sdk/platform/google_appengine/google/appengine/tools/devappserver2/module.py", line 1555, in start
        self._add_instance()
      File "/home/vagrant/google-cloud-sdk/platform/google_appengine/google/appengine/tools/devappserver2/module.py", line 1707, in _add_instance
        expect_ready_request=True)
      File "/home/vagrant/google-cloud-sdk/platform/google_appengine/google/appengine/tools/devappserver2/custom_runtime.py", line 73, in new_instance
        assert self._runtime_config_getter().custom_config.custom_entrypoint
      File "/home/vagrant/google-cloud-sdk/platform/google_appengine/google/appengine/tools/devappserver2/module.py", line 383, in _get_runtime_config
        raise ValueError('The --custom_entrypoint flag must be set for '
    ValueError: The --custom_entrypoint flag must be set for custom runtimes
    


Answer: **UPDATE**

THIS MAY NO LONGER BE ACCURATE. SEE NICK'S ANSWER.

(Though I could not get that working. But I did not try very hard)

* * *

There is a completely undocumented but absolutely essential piece of
information w.r.t. custom managed VMs:

**THEY CANNOT BE RUN ON THE DEVELOPMENT SERVER!**

If you think this crucial fact would be mentioned anywhere sane, like say, the
documentation page for custom managed VMs, or for `dev_appserver.py`, or even
as an error message when running `dev_appserver.py`, then you are giving
Google far too much credit.

The only place where I can find any kind of statement about this is in the
Readme file of the [appengine-java-vm-guestbook-extras
demo](https://github.com/GoogleCloudPlatform/appengine-java-vm-guestbook-
extras) on github (seriously):

> The Cloud SDK does not support anymore running custom runtimes when a
> Dockerfile is provided. You'll have to deploy the application to App Engine

Google does not care to:

  1. Implement this basic and important feature.
  2. Document that the development server is missing such an important feature.
  3. Give any reasonable error message when the user tires to perform the action.

I hope this answer saves some sorry developer from the days of torment I
suffered because of this.

