5

問題の説明

Google が提供する標準の python27 マネージド VM と同じように動作する、Google App Engine 用のカスタム マネージド VM を作成しようとしています。(これは、C++ ライブラリをランタイムに追加するための最初のステップとして行っています)。

Googleドキュメントから、次の Dockerfile は標準の python27 ランタイムを指定します。

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

gcloud preview app run標準の python27 ランタイムを使用して生成された Dockerfile を調べて、これが正しい Dockerfile であることを確認しました。これと同じです。

しかし、この Dockerfile を使用してdev_appserver.py、または使用してアプリケーションを実行するgcloud preview app runと、次のエラーが表示されます。

The --custom_entrypoint flag must be set for custom runtimes

最新バージョンの gcloud (1.9.86、app-engine-python コンポーネント バージョン 1.9.28) とスタンドアロン python アプリ エンジン SDK (1.9.28) を使用しています。以前のバージョンでも同じ問題が発生したため、最新のバージョンに更新しました。

私が試したこと:

gcloud preview app run --helpについて次のように述べています--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"

これについてどうすればよいかわかりません。docker イメージに ENTRYPOINT が含まれていてはいけませんか? 追加で提供する必要があるのはなぜですか? また、画像のエントリポイントは何にする必要がありgcr.io/google_appengine/python-compatますか? Google はこれに関するドキュメントを提供していません。

エラーを無音にする意味のない を試しました--custom-entrypoint="echo"が、アプリケーションは HTTP 要求に応答しません。

私が見つけた他の2つの関連するstackoverflowの質問は役に立ちませんでした。受け入れられた回答は、これが解決された SDK のバグであることを示唆しているようです。しかし、最新のものを含む 2 つのバージョンの SDK で試しましたが、まだ問題があります。

再現手順:

私の問題を強調するために、エラーを生成する簡単なアプリケーションを作成しました。次の 3 つのファイルだけで構成されます。

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

これDockerfileは、python27 ランタイムに使用されるものと同じです (実際には、python27 ランタイムを使用するときに生成された Dockerfile から文字通りコピーアンドペーストされgcloud preview app runます) 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)

ただし、これら 3 つのファイルを含むディレクトリで実行するdev_appserver.py app.yamlと、次のエラーが発生します。

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
4

3 に答える 3

10

アップデート

これはもはや正確ではないかもしれません。ニックの答えを見てください。

(私はそれを機能させることができませんでしたが、私は一生懸命努力しませんでした)


完全に文書化されていませんが、カスタム管理された VM に関して絶対に不可欠な情報があります。

開発サーバーでは実行できません!

この重要な事実が、たとえばカスタム マネージド VM のドキュメント ページや のドキュメント ページ、 dev_appserver.pyさらには の実行時のエラー メッセージなど、適切な場所で言及されていると思われるdev_appserver.py場合は、Google を信用しすぎています。

これに関する何らかの声明を見つけることができる唯一の場所は、github のappengine-java-vm-guestbook-extras デモの Readme ファイルです(真剣に):

Cloud SDK は、Dockerfile が提供されている場合、カスタム ランタイムの実行をサポートしなくなりました。アプリケーションを App Engine にデプロイする必要があります

Google は次のことを気にしません。

  1. この基本的かつ重要な機能を実装します。
  2. 開発サーバーにはそのような重要な機能が欠けていることを文書化してください。
  3. ユーザーがアクションを実行するのに疲れたときに、適切なエラー メッセージを表示します。

この回答が、このために苦しんだ苦痛の日々から、申し訳ない開発者を救ってくれることを願っています。

于 2015-11-19T20:48:52.907 に答える
6

EDIT 1 : user862857 によって投稿されたソリューション、Docker 自体を利用して Dockerfile からイメージを構築し、コンテナーで実行します。これは、開発コンテキストでマネージド VM とカスタム ランタイムを実行するための優れたアプローチでもあります。


受け入れられた答えは正しくないようです。急速に進化するベータ版製品を扱う場合、github README は正式なドキュメントよりも優先されるべきではありません。runtime: customOPの投稿で言及されているDockerfileを使用して、開発環境のアプリで完全に可能です。

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

--runtime=python-compatフラグを使用しています。/_ah/startただし、およびへのリクエストをキャッチする必要があり/_ah/healthます。次のファイルを指定して、次のコマンドを実行してみてください。

devserver command

$ dev_appserver.py app.yaml --runtime=python-compat

app.yaml

runtime: custom
vm: true
api_version: 1
threadsafe: true

handlers:
- url: /.*
  script: main.app

Dockerfile

FROM gcr.io/google_appengine/python-compat

RUN apt-get update

RUN apt-get install -y gwhois

ADD . /app

main.py

import logging
import webapp2
from subprocess import Popen, PIPE

class OkHandler (webapp2.RequestHandler):
    def get (self): 
        self.response.write ('ok')

class MainPage(webapp2.RequestHandler):
    def get(self):
        self.response.headers['Content-Type'] = 'text/plain'
        domain = self.request.get ('domain')
        cmd = ["gwhois", domain]
        process = Popen (cmd, stdout=PIPE, stderr=PIPE)
        output, err = process.communicate()
        exit_code = process.wait()
        self.response.write('stdout: %s' % output)
        logging.info ('stderr: %s' % err)

app = webapp2.WSGIApplication([
    ('/', MainPage),
    ('/_ah/start', OkHandler),
    ('/_ah/health', OkHandler)
], debug=True)

にリクエストを送信して、/?domain=stackoverflow.comこの動作を確認してください。


注意

python-compat ランタイムから完全に分離し、単純に python WSGI アプリをデプロイ/テストし--custom_entrypointたい場合は、適切なポートで適切な WSGI アプリの実行を開始するコマンドがある限り、フラグを使用することもできます (そのようなコマンドはuwsgiまたはgunicorn です)。

于 2015-12-15T00:37:16.100 に答える