Ale*_*šić 5 python deployment google-app-engine flask google-cloud-platform
所以,我想尝试 GCloud,因为您可以非常轻松地部署无服务器的东西。我制作了一个简单的 Flask 应用程序来测试它,这是该应用程序的完整代码:
from flask import (
Flask
)
from flask_cors import CORS
app = Flask(__name__)
cors = CORS(app)
@app.route('/ping', methods=['GET'])
def ping():
return 'It works!', 200
def create_app():
return app
if __name__ == '__main__':
app.run()
Run Code Online (Sandbox Code Playgroud)
这是 Dockerfile:
FROM python:3.7-slim
COPY . ./home/gcloud-test
WORKDIR /home/gcloud-test
RUN pip install -r requirements.txt
EXPOSE 5000
CMD python3 main.py
Run Code Online (Sandbox Code Playgroud)
我也试过使用gunicorn
和waitress
启动服务器,同样的事情发生了。
我运行以部署到 gcloud 的命令:
gcloud builds submit --tag gcr.io/PROJECT_ID/PROJECT_NAME
gcloud run deploy --image gcr.io/PROJECT_ID/PROJECT_NAME --platform managed --verbosity=debug
这是来自控制台的堆栈跟踪:
Deploying container to Cloud Run service [PROJECT_NAME] in project [PROJECT_ID] region [europe-west1]
Deploying...
Creating Revision... Cloud Run error: Container failed to start. Failed to start and then listen on the port defined by the PORT environment variable. Logs for this revision might contain more information....failed
Deployment failed
DEBUG: (gcloud.run.deploy) Cloud Run error: Container failed to start. Failed to start and then listen on the port defined by the PORT environment variable. Logs for this revision might contain more information.
Traceback (most recent call last):
resources = calliope_command.Run(cli=self, args=args)
File "C:\Users\aleks\AppData\Local\Google\Cloud SDK\google-cloud-sdk\lib\googlecloudsdk\calliope\backend.py", line 808, in Run
resources = command_instance.Run(args)
File "C:\Users\aleks\AppData\Local\Google\Cloud SDK\google-cloud-sdk\lib\surface\run\deploy.py", line 219, in Run
build_log_url=build_log_url)
File "C:\Users\aleks\AppData\Local\Google\Cloud SDK\google-cloud-sdk\lib\googlecloudsdk\command_lib\run\serverless_operations.py", line 1087, in ReleaseService
self.WaitForCondition(poller)
File "C:\Users\aleks\AppData\Local\Google\Cloud SDK\google-cloud-sdk\lib\googlecloudsdk\command_lib\run\serverless_operations.py", line 594, in WaitForCondition
File "C:\Users\aleks\AppData\Local\Google\Cloud SDK\google-cloud-sdk\lib\googlecloudsdk\api_lib\util\waiter.py", line 326, in PollUntilDone
File "C:\Users\aleks\AppData\Local\Google\Cloud SDK\google-cloud-sdk\lib\googlecloudsdk\core\util\retry.py", line 219, in RetryOnResult
File "C:\Users\aleks\AppData\Local\Google\Cloud SDK\google-cloud-sdk\lib\googlecloudsdk\command_lib\run\serverless_operations.py", line 251, in Poll
File "C:\Users\aleks\AppData\Local\Google\Cloud SDK\google-cloud-sdk\lib\googlecloudsdk\command_lib\run\serverless_operations.py", line 230, in _PollTerminalSubconditions
self._PossiblyFailStage(condition, message)
File "C:\Users\aleks\AppData\Local\Google\Cloud SDK\google-cloud-sdk\lib\googlecloudsdk\command_lib\run\serverless_operations.py", line 349, in _PossiblyFailStage
message)
File "C:\Users\aleks\AppData\Local\Google\Cloud SDK\google-cloud-sdk\lib\googlecloudsdk\core\console\progress_tracker.py", line 915, in FailStage
raise failure_exception # pylint: disable=raising-bad-type
googlecloudsdk.command_lib.run.exceptions.DeploymentFailedError: Cloud Run error: Container failed to start. Failed to start and then listen on the port defined by the PORT environment variable. Logs for this revision might contain more information.
ERROR: (gcloud.run.deploy) Cloud Run error: Container failed to start. Failed to start and then listen on the port defined by the PORT environment variable. Logs for this revision might contain more information.
Run Code Online (Sandbox Code Playgroud)
当我去网上查看日志时,我看到该应用程序已启动,几分钟后健康检查失败,附上截图:
任何形式的帮助将不胜感激。
您将容器(和 Flask 应用程序)配置为侦听端口 5000,但云运行容器合约表示您需要侦听端口 8080(作为PORT
环境变量提供)。
容器必须在请求发送到的端口上侦听 0.0.0.0 上的请求。默认情况下,请求会发送到 8080,但您可以将 Cloud Run 配置为将请求发送到您选择的端口。
正如日志所示,运行状况检查因此失败。
您可以在部署时指定端口,如此处所示。
例如:
gcloud run deploy --image gcr.io/PROJECT_ID/PROJECT_NAME --platform managed --port 5000 --verbosity=debug
Run Code Online (Sandbox Code Playgroud)
但这还不够。
Flask.run()
默认不监听0.0.0.0
(默认为 127.0.0.1)。您的日志确实确认服务器正在侦听http://127.0.0.1:5000
. 您需要将其指定为呼叫时要监听的主机run()
。
我能够用您编写的代码复制您的问题。我将应用程序启动行更改为:
gcloud run deploy --image gcr.io/PROJECT_ID/PROJECT_NAME --platform managed --port 5000 --verbosity=debug
Run Code Online (Sandbox Code Playgroud)
重建并部署,将端口指定为 5000,如上面的部署命令所示,它起作用了。