繁体   English   中英

如何在计算引擎实例上运行google appengine docker镜像?

[英]How do I run a google appengine docker image on a compute engine instance?

我有以下docker文件:

FROM gcr.io/google_appengine/python-compat
MAINTAINER Me@me.com

RUN apt-get update
RUN apt-get -y upgrade

ADD ./app/ /app
ADD app.yaml /app/

RUN mkdir -p /var/log/app_engine

我创建日志目录,否则我收到以下错误

sudo docker run gcr.io/MY-PROJECT/ae-image
Traceback (most recent call last):
  File "/home/vmagent/python_vm_runtime/vmboot.py", line 133, in <module>
    run_file(__file__, globals())
  File "/home/vmagent/python_vm_runtime/vmboot.py", line 129, in run_file
    execfile(_PATHS.script_file(script_name), globals_)
  File "/home/vmagent/python_vm_runtime/google/appengine/tools/vmboot.py", line 32, in <module>
    initialize.InitializeFileLogging()
  File "/home/vmagent/python_vm_runtime/google/appengine/ext/vmruntime/initialize.py", line 92, in InitializeFileLogging
    APP_LOG_FILE, maxBytes=MAX_LOG_BYTES, backupCount=LOG_BACKUP_COUNT)
  File "/usr/lib/python2.7/logging/handlers.py", line 117, in __init__
    BaseRotatingHandler.__init__(self, filename, mode, encoding, delay)
  File "/usr/lib/python2.7/logging/handlers.py", line 64, in __init__
    logging.FileHandler.__init__(self, filename, mode, encoding, delay)
  File "/usr/lib/python2.7/logging/__init__.py", line 901, in __init__
    StreamHandler.__init__(self, self._open())
  File "/usr/lib/python2.7/logging/__init__.py", line 924, in _open
    stream = open(self.baseFilename, self.mode)
IOError: [Errno 2] No such file or directory: '/var/log/app_engine/app.log.json'

但现在我收到以下错误:

sudo docker run -ti gcr.io/MY-PROJECT/ae-image /app/app.yaml
LOG 1 1433422040537094 Using module_yaml_path from argv: /app/app.yaml
Traceback (most recent call last):
  File "/home/vmagent/python_vm_runtime/vmboot.py", line 133, in <module>
    run_file(__file__, globals())
  File "/home/vmagent/python_vm_runtime/vmboot.py", line 129, in run_file
    execfile(_PATHS.script_file(script_name), globals_)
  File "/home/vmagent/python_vm_runtime/google/appengine/tools/vmboot.py", line 65, in <module>
    main()
  File "/home/vmagent/python_vm_runtime/google/appengine/tools/vmboot.py", line 61, in main
    vmservice.CreateAndRunService(module_yaml_path)
  File "/home/vmagent/python_vm_runtime/google/appengine/ext/vmruntime/vmservice.py", line 154, in CreateAndRunService
    service.CreateServer()
  File "/home/vmagent/python_vm_runtime/google/appengine/ext/vmruntime/vmservice.py", line 126, in CreateServer
    appengine_config = vmconfig.BuildVmAppengineEnvConfig()
  File "/home/vmagent/python_vm_runtime/google/appengine/ext/vmruntime/vmconfig.py", line 60, in BuildVmAppengineEnvConfig
    _MetadataGetter('gae_backend_instance'))
  File "/home/vmagent/python_vm_runtime/google/appengine/ext/vmruntime/vmconfig.py", line 37, in _MetadataGetter
    return urllib2.urlopen(req).read()
  File "/usr/lib/python2.7/urllib2.py", line 127, in urlopen
    return _opener.open(url, data, timeout)
  File "/usr/lib/python2.7/urllib2.py", line 407, in open
    response = meth(req, response)
  File "/usr/lib/python2.7/urllib2.py", line 520, in http_response
    'http', request, response, code, msg, hdrs)
  File "/usr/lib/python2.7/urllib2.py", line 445, in error
    return self._call_chain(*args)
  File "/usr/lib/python2.7/urllib2.py", line 379, in _call_chain
    result = func(*args)
  File "/usr/lib/python2.7/urllib2.py", line 528, in http_error_default
    raise HTTPError(req.get_full_url(), code, msg, hdrs, fp)
urllib2.HTTPError: HTTP Error 404: Not Found

我可以做什么样的配置或操作,以便我可以在docker中运行此docker镜像,如:

sudo docker run gcr.io/MY-PROJECT/ae-image

我的另一个选择是在python中运行AE,但我不知道如何告诉它使用生产数据存储区(GCD)。 我想这就是我在上面的docker实现中遇到的问题。

可以单独运行应用程序容器,但有一些细微差别。

卷绑定
首先,让我们看一下日志目录部分,您可以在其中创建/ var / log / appengine。 gcloud preview app run在容器上时,它实际上使用卷绑定运行它,将容器内的/ var / log / appengine映射到主机上的/ var / log / appengine /(〜其他路径〜)。 如果您正在使用boot2docker,则可以运行boot2docker ssh并在那里查看这些服务器日志。

环境变量
其次,让我们分开你的应用程序仍未运行的原因。 当应用程序容器启动时,它会通过几个步骤来启动应用程序服务器。 整个过程的入口点是/home/vmagent/python_vm_runtime/vmboot.py ,它是启动时运行的容器中的脚本。

问题是此脚本从多个环境变量中提取有关应用程序的信息。 如果你gcloud preview app run并以这种方式启动容器,你可以在其中启动一个shell,如下所示:

$ gcloud preview app run <your_application.yaml>
$ boot2docker ssh
$ docker ps
<output omitted - use it to find your container id> 
$ docker exec -ti <your_container_id> /bin/sh
$ env
API_PORT=10000
HOSTNAME=b758e92cb8d6
HOME=/root
OLDPWD=/home/vmagent/python_vm_runtime/google/appengine/ext
GAE_MODULE_INSTANCE=0
PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin
DEBIAN_FRONTEND=noninteractive
MODULE_YAML_PATH=app.yaml
GAE_PARTITION=dev
API_HOST=192.168.42.1
PWD=/home/vmagent/python_vm_runtime/google/appengine/ext/vmruntime
GAE_LONG_APP_ID=temp

事实证明,您特别错过了环境变量GAE_MODULE_INSTANCE=0 vmconfig.py中有一行说:

instance = (os.environ.get('GAE_MODULE_INSTANCE') or
          _MetadataGetter('gae_backend_instance'))

在开发模式下,脚本需要处理环境变量,而不是_MetadataGetter。 最终,应用程序容器将需要所有这些环境变量,否则它将继续在其他地方中断。

因此,当您执行docker run时,可以通过设置所有这些环境变量来运行应用程序。 你可以用-e标志来做到这一点。 你需要设置很多环境变量,所以我建议你写一个shell脚本来做:-)

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM