使用 Docker 启动和停止 App Engine 实例
Starting and stopping App Engine instances with Docker
我已经使用 Docker(在 OSX 上)在本地设置了一个 App Engine 项目,并使用通常的 "gcloud preview app run app.yaml" 命令 运行 连接了一个服务器.据我所知,这会一遍又一遍地创建新图像。经过一个小时左右的工作,我最终得到了大约 30 docker 张图片,每张图片占用 130MB。
最后我被告知无法再绑定到 localhost:8080。我尝试杀死所有容器和图像,但在我重新启动之前仍然无法使用 localhost:8080。
我似乎没有正确使用 Docker/gcloud。任何人都知道我可能做错了什么?除了点击命令 C 并再次 运行ning "run" 命令之外,还有其他方法我应该重新启动 App Engine 实例吗?
更新:仔细观察后,我注意到当我在本地 运行 一个应用程序并创建一个容器时收到此消息:"http: Hijack is incompatible with use of CloseNotifier"。我对 Docker 不够熟悉,无法理解这里发生了什么。所有搜索似乎都指向我没有使用的 Go。
更新 2:这是跟踪:
Creating container...
INFO 2015-05-05 02:23:28,293 containers.py:560] Container 1564ce4344957114312d6d1dc696ffbb4176b40ace6dcff5e4239e13ee04a8f6 created.
Exception in thread Thread-2:
Traceback (most recent call last):
File "/System/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/threading.py", line 810, in __bootstrap_inner
self.run()
File "/System/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/threading.py", line 763, in run
self.__target(*self.__args, **self.__kwargs)
File "/Users/judeosborn/google-cloud-sdk/platform/google_appengine/google/appengine/tools/docker/containers.py", line 643, in _ListenToLogs
for line in log_lines:
File "/Users/judeosborn/google-cloud-sdk/./lib/docker/docker/client.py", line 225, in _multiplexed_response_stream_helper
socket = self._get_raw_response_socket(response)
File "/Users/judeosborn/google-cloud-sdk/./lib/docker/docker/client.py", line 167, in _get_raw_response_socket
self._raise_for_status(response)
File "/Users/judeosborn/google-cloud-sdk/./lib/docker/docker/client.py", line 119, in _raise_for_status
raise errors.APIError(e, response, explanation=explanation)
APIError: 500 Server Error: Internal Server Error ("http: Hijack is incompatible with use of CloseNotifier")
INFO 2015-05-05 02:23:28,606 module.py:1745] New instance for module "default" serving on:
http://localhost:8080
尝试运行:
$ ps uax | egrep "gcloud|appserver"
如果您看到任何 运行、kill
它...您甚至可能需要 kill -9
它。
Docker 1.6.x [reference] 存在一个持续存在的问题,导致 gcloud
无法与托管虚拟机(您似乎正在使用)正常工作.在它得到修复之前,最简单的解决方法是将开发机器中的 Docker 降级到版本 1.5.0,这是已知可用的最新版本。
对于 Ubuntu,您可以执行以下操作:
$ curl -sSL https://get.docker.com/ubuntu | sed 's/lxc-docker/lxc-docker-1.5.0/' | sudo sh
对于其他 Linux 发行版,您可能需要修改 sed
模式。
另一方面,如果您在 Mac OS X 下使用 Boot2Docker,请按照以下步骤操作:
- 完全卸载您之前的 Boot2Docker/Docker 安装程序;有一个很好的指南here
- 按照说明 here 重新安装 Boot2Docker/Docker。 重要:您必须在完成 "Install Boot2Docker" 步骤之后和 "Start the Boot2Docker Application" 之前立即停止。到达那里后,打开终端并执行以下命令:
$ mkdir ~/.boot2docker
$ echo 'ISOURL="https://github.com/boot2docker/boot2docker/releases/download/v1.5.0/boot2docker.iso"' > ~/.boot2docker/profile
此时,您可以继续 "Start the Boot2Docker Application" 部分并完成安装。您现在应该有一个有效的 Docker 启动板来启动托管 VM。最好通过以下命令仔细检查您是否安装了正确的版本:
$ boot2docker ssh docker version | egrep "(Client|Server) version"
输出应如下所示:
Client version: 1.5.0
Server version: 1.5.0
现在您可以重试您的原始命令:
$ gcloud preview app run app.yaml
我已经使用 Docker(在 OSX 上)在本地设置了一个 App Engine 项目,并使用通常的 "gcloud preview app run app.yaml" 命令 运行 连接了一个服务器.据我所知,这会一遍又一遍地创建新图像。经过一个小时左右的工作,我最终得到了大约 30 docker 张图片,每张图片占用 130MB。
最后我被告知无法再绑定到 localhost:8080。我尝试杀死所有容器和图像,但在我重新启动之前仍然无法使用 localhost:8080。
我似乎没有正确使用 Docker/gcloud。任何人都知道我可能做错了什么?除了点击命令 C 并再次 运行ning "run" 命令之外,还有其他方法我应该重新启动 App Engine 实例吗?
更新:仔细观察后,我注意到当我在本地 运行 一个应用程序并创建一个容器时收到此消息:"http: Hijack is incompatible with use of CloseNotifier"。我对 Docker 不够熟悉,无法理解这里发生了什么。所有搜索似乎都指向我没有使用的 Go。
更新 2:这是跟踪:
Creating container...
INFO 2015-05-05 02:23:28,293 containers.py:560] Container 1564ce4344957114312d6d1dc696ffbb4176b40ace6dcff5e4239e13ee04a8f6 created.
Exception in thread Thread-2:
Traceback (most recent call last):
File "/System/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/threading.py", line 810, in __bootstrap_inner
self.run()
File "/System/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/threading.py", line 763, in run
self.__target(*self.__args, **self.__kwargs)
File "/Users/judeosborn/google-cloud-sdk/platform/google_appengine/google/appengine/tools/docker/containers.py", line 643, in _ListenToLogs
for line in log_lines:
File "/Users/judeosborn/google-cloud-sdk/./lib/docker/docker/client.py", line 225, in _multiplexed_response_stream_helper
socket = self._get_raw_response_socket(response)
File "/Users/judeosborn/google-cloud-sdk/./lib/docker/docker/client.py", line 167, in _get_raw_response_socket
self._raise_for_status(response)
File "/Users/judeosborn/google-cloud-sdk/./lib/docker/docker/client.py", line 119, in _raise_for_status
raise errors.APIError(e, response, explanation=explanation)
APIError: 500 Server Error: Internal Server Error ("http: Hijack is incompatible with use of CloseNotifier")
INFO 2015-05-05 02:23:28,606 module.py:1745] New instance for module "default" serving on:
http://localhost:8080
尝试运行:
$ ps uax | egrep "gcloud|appserver"
如果您看到任何 运行、kill
它...您甚至可能需要 kill -9
它。
Docker 1.6.x [reference] 存在一个持续存在的问题,导致 gcloud
无法与托管虚拟机(您似乎正在使用)正常工作.在它得到修复之前,最简单的解决方法是将开发机器中的 Docker 降级到版本 1.5.0,这是已知可用的最新版本。
对于 Ubuntu,您可以执行以下操作:
$ curl -sSL https://get.docker.com/ubuntu | sed 's/lxc-docker/lxc-docker-1.5.0/' | sudo sh
对于其他 Linux 发行版,您可能需要修改 sed
模式。
另一方面,如果您在 Mac OS X 下使用 Boot2Docker,请按照以下步骤操作:
- 完全卸载您之前的 Boot2Docker/Docker 安装程序;有一个很好的指南here
- 按照说明 here 重新安装 Boot2Docker/Docker。 重要:您必须在完成 "Install Boot2Docker" 步骤之后和 "Start the Boot2Docker Application" 之前立即停止。到达那里后,打开终端并执行以下命令:
$ mkdir ~/.boot2docker
$ echo 'ISOURL="https://github.com/boot2docker/boot2docker/releases/download/v1.5.0/boot2docker.iso"' > ~/.boot2docker/profile
此时,您可以继续 "Start the Boot2Docker Application" 部分并完成安装。您现在应该有一个有效的 Docker 启动板来启动托管 VM。最好通过以下命令仔细检查您是否安装了正确的版本:
$ boot2docker ssh docker version | egrep "(Client|Server) version"
输出应如下所示:
Client version: 1.5.0
Server version: 1.5.0
现在您可以重试您的原始命令:
$ gcloud preview app run app.yaml