Gcloud应用程序部署-.net HelloWorld问题

时间:2020-07-04 15:55:36

标签: google-app-engine deployment gcloud

我正在学习gcloud应用程序部署的学习过程。我一直在努力从以下位置运行.net HelloWorld示例代码:

https://github.com/GoogleCloudPlatform/dotnet-docs-samples/tree/master/appengine/flexible/HelloWorld

当我使用Visual Studio启动该示例时,该示例在桌面上运行良好。但是,我无法超越 从cmd窗口使用“ gcloud app deploy”运行。以下是两次运行的详细信息,首先是 即用型,第二个是在添加doocker文件之后。

还有其他人能够像当前版本的gcloud sdk一样运行HelloWorld示例吗?

感谢您的帮助,

鲍勃

这是gcloud版本信息:

gcloud --version
Google Cloud SDK 299.0.0
bq 2.0.58
core 2020.06.26
gsutil 4.51

运行1

这是重新安装gcloud sdk和新克隆的gcloud之后的gcloud输出的尾端 / dotnet-docs-samples /...

...
Step #0: Status: Downloaded newer image for gcr.io/gcp-runtimes/aspnetcorebuild@sha256:f5552a5efdaf278a3124ea10fd1c9636b09fc9f98f9e620cbd71279797576b3f
Step #0: gcr.io/gcp-runtimes/aspnetcorebuild@sha256:f5552a5efdaf278a3124ea10fd1c9636b09fc9f98f9e620cbd71279797576b3f
Step #0: No .deps.json file found for the app
Finished Step #0
ERROR
ERROR: build step 0 "gcr.io/gcp-runtimes/aspnetcorebuild@sha256:f5552a5efdaf278a3124ea10fd1c9636b09fc9f98f9e620cbd71279797576b3f" failed: step exited with non-zero status: 1
------------------------------------------------------------------------------------------------------------------------

ERROR: (gcloud.app.deploy) Cloud build failed. Check logs at https://console.cloud.google.com/cloud-build/builds/44677e0d-0fcb-4460-907b-835cbf621f5e?project=704308180369 Failure status: UNKNOWN: Error Response: [2] Build failed; check build logs for details

运行2

经过一番搜索,我发现了一个建议,以改用自定义运行时和一个docker文件。 因此,我做了两个更改,一个在app.yaml文件中,然后添加了docker文件。

这是app.yaml文件。

runtime: custom
env: flex

# This sample incurs costs to run on the App Engine flexible environment. 
# The settings below are to reduce costs during testing and are not appropriate
# for production use. For more information, see:
# https://cloud.google.com/appengine/docs/flexible/python/configuring-your-app-with-app-yaml
manual_scaling:
  instances: 1
resources:
  cpu: 1
  memory_gb: 4
  disk_size_gb: 10

env_variables:
  # The __ in My__Greeting will be translated to a : by ASP.NET.
  My__Greeting: Hello AppEngine!

readiness_check:
  app_start_timeout_sec: 600


这是Dockerfile。该文件来自以下位置:

https://github.com/dotnet/dotnet-docker/blob/50e95cd9af6458ce0db21e6ec952e29c3ee1fadf/2.1/aspnet/alpine3.10/amd64/Dockerfile
ARG REPO=mcr.microsoft.com/dotnet/core/runtime-deps
FROM $REPO:2.1-alpine3.10

# Install ASP.NET Core
ENV ASPNETCORE_VERSION 2.1.15

RUN wget -O aspnetcore.tar.gz https://dotnetcli.azureedge.net/dotnet/aspnetcore/Runtime/$ASPNETCORE_VERSION/aspnetcore-runtime-$ASPNETCORE_VERSION-linux-musl-x64.tar.gz \
    && aspnetcore_sha512='4a6ab78abc08c3e02c948de0af5fd324269785adad1b4e17bb849025ab280b7b8216cb48da5d480270cf3d596b342cedd4dc77eeaae82151fea44816e3856c69' \
    && echo "$aspnetcore_sha512  aspnetcore.tar.gz" | sha512sum -c - \
    && mkdir -p /usr/share/dotnet \
    && tar -zxf aspnetcore.tar.gz -C /usr/share/dotnet \
    && rm aspnetcore.tar.gz \
    && ln -s /usr/share/dotnet/dotnet /usr/bin/dotnet


这是使用docker文件运行的结尾。

...
  },
  "handlers": [
    {
      "script": {
        "scriptPath": "PLACEHOLDER"
      },
      "urlRegex": ".*"
    }
  ],
  "manualScaling": {
    "instances": 1
  },
  "resources": {
    "cpu": 1.0,
    "diskGb": 10,
    "memoryGb": 0.5
  },
  "runtime": "vm"
}"
DEBUG: Operation [apps/solitairesupport/operations/a41d48d9-6fc8-422b-84b6-1e18b3a70162] not complete. Waiting to retry.
Updating service [default] (this may take several minutes).../DEBUG: Operation [apps/solitairesupport/operations/a41d48d9-6fc8-422b-84b6-1e18b3a70162] not complete. Waiting to retry.
Updating service [default] (this may take several minutes)...-DEBUG: Operation [apps/solitairesupport/operations/a41d48d9-6fc8-422b-84b6-1e18b3a70162] not complete. Waiting to retry.

[MANY LINES REMOVED HERE]

Updating service [default] (this may take several minutes)...-DEBUG: Operation [apps/solitairesupport/operations/a41d48d9-6fc8-422b-84b6-1e18b3a70162] not complete. Waiting to retry.
Updating service [default] (this may take several minutes).../DEBUG: Operation [apps/solitairesupport/operations/a41d48d9-6fc8-422b-84b6-1e18b3a70162] complete. Result: {
    "done": true,
    "error": {
        "code": 9,
        "message": "\nApplication startup error! Code: APP_CONTAINER_CRASHED\n"
    },
    "metadata": {
        "@type": "type.googleapis.com/google.appengine.v1.OperationMetadataV1",
        "insertTime": "2020-07-03T17:06:36.191Z",
        "method": "google.appengine.v1.Versions.CreateVersion",
        "target": "apps/solitairesupport/services/default/versions/20200703t100554",
        "user": "xxxx@gmail.com"
    },
    "name": "apps/solitairesupport/operations/a41d48d9-6fc8-422b-84b6-1e18b3a70162"
}
Updating service [default] (this may take several minutes)...failed.
DEBUG: (gcloud.app.deploy) Error Response: [9]
Application startup error! Code: APP_CONTAINER_CRASHED
Traceback (most recent call last):
  File "...AppData\Local\Google\Cloud SDK\google-cloud-sdk\lib\googlecloudsdk\calliope\cli.py", line 983, in Execute
    resources = calliope_command.Run(cli=self, args=args)
  File "...\Local\Google\Cloud SDK\google-cloud-sdk\lib\googlecloudsdk\calliope\backend.py", line 807, in Run
    resources = command_instance.Run(args)
  File "...\Local\Google\Cloud SDK\google-cloud-sdk\lib\surface\app\deploy.py", line 117, in Run
    default_strategy=flex_image_build_option_default))
  File "...\Local\Google\Cloud SDK\google-cloud-sdk\lib\googlecloudsdk\command_lib\app\deploy_util.py", line 651, in RunDeploy
    ignore_file=args.ignore_file)
  File "...\Local\Google\Cloud SDK\google-cloud-sdk\lib\googlecloudsdk\command_lib\app\deploy_util.py", line 437, in Deploy
    extra_config_settings)
  File "...\Local\Google\Cloud SDK\google-cloud-sdk\lib\googlecloudsdk\api_lib\app\appengine_api_client.py", line 208, in DeployService
    poller=done_poller)
  File "...\Local\Google\Cloud SDK\google-cloud-sdk\lib\googlecloudsdk\api_lib\app\operations_util.py", line 314, in WaitForOperation
    sleep_ms=retry_interval)
  File "...\Local\Google\Cloud SDK\google-cloud-sdk\lib\googlecloudsdk\api_lib\util\waiter.py", line 264, in WaitFor
    sleep_ms, _StatusUpdate)
  File "...\Local\Google\Cloud SDK\google-cloud-sdk\lib\googlecloudsdk\api_lib\util\waiter.py", line 326, in PollUntilDone
    sleep_ms=sleep_ms)
  File "...\Local\Google\Cloud SDK\google-cloud-sdk\lib\googlecloudsdk\core\util\retry.py", line 229, in RetryOnResult
    if not should_retry(result, state):
  File "...\Local\Google\Cloud SDK\google-cloud-sdk\lib\googlecloudsdk\api_lib\util\waiter.py", line 320, in _IsNotDone
    return not poller.IsDone(operation)
  File "...\Local\Google\Cloud SDK\google-cloud-sdk\lib\googlecloudsdk\api_lib\app\operations_util.py", line 183, in IsDone
    encoding.MessageToPyValue(operation.error)))
googlecloudsdk.api_lib.app.operations_util.OperationError: Error Response: [9]
Application startup error! Code: APP_CONTAINER_CRASHED

ERROR: (gcloud.app.deploy) Error Response: [9]
Application startup error! Code: APP_CONTAINER_CRASHED

1 个答案:

答案 0 :(得分:0)

好的,我熟悉Google Cloud Platform,但现在(不)熟悉.NET。

我正在使用Linux(!)和Cloud Shell:

gcloud alpha cloud-shell ssh

我克隆了存储库,但没有其他更改。

我能够在本地运行项目并进行测试:

dotnet run

,然后从另一个shell:

curl localhost:8080
Hello World!

注意,该状态尚未声明(也许很明显),但是您必须dotnet run(最好是dotnet publish)来创建./bin/Debug目录。

我创建了一个项目,设置了帐单,创建了一个应用引擎应用程序:

PROJECT="[[YOUR-PROJECT-ID]]"
BILLING="[[YOUR-BILLING-ID]]"
REGION="[[YOUR-REGION]]"

gcloud projects create ${PROJECT}
gcloud beta billing projects link ${PROJECT} --billing-account=${BILLING}
gcloud app create --project=${PROJECT} --region=${REGION}

然后,根据文档:

dotnet publish

./bin/Debug/netcoreapp2.1/publish的内容:

     56 Jul  6 16:23 appsettings.json
    544 Jul  6 16:23 app.yaml
 223992 Jul  6 16:27 HelloWorld.deps.json
   8192 Jul  6 16:27 HelloWorld.dll
   1708 Jul  6 16:27 HelloWorld.pdb
    213 Jul  6 16:27 HelloWorld.runtimeconfig.json
    516 Jul  6 16:30 web.config

注意包含app.yamlHelloWorld.deps.json

然后:

gcloud app deploy ./bin/Debug/netcoreapp2.1/publish/app.yaml \
--project=${PROJECT}

并且:

ENDPOINT=$(\
  gcloud app describe \
  --project=${PROJECT} \
  --format="value(defaultHostname)")

curl ${ENDPOINT}
Hello AppEngine!

然后,在./appengine/flexible/HelloWorld目录中,创建Dockerfile

FROM mcr.microsoft.com/dotnet/core/sdk:2.1 AS builder
WORKDIR /source

COPY *.sln .
COPY *.csproj .
RUN dotnet restore

COPY . .
RUN dotnet publish -c release -o /app --no-restore

FROM mcr.microsoft.com/dotnet/core/aspnet:2.1
WORKDIR /app
COPY --from=builder /app ./
ENTRYPOINT ["dotnet", "HelloWorld.dll"]

注意,以this为指南。

注意我降级为2.1(而不是3.1)以避免dotnet构建错误,但这是由于我对运行时不熟悉。

我更改了Program.cs,以强制使用:8080

public static IWebHost BuildWebHost(string[] args) =>
    WebHost.CreateDefaultBuilder(args)
        .UseStartup<Startup>()
        .UseUrls("http://0.0.0.0:8080")
        .Build();
}

我修改了app.yaml以使用自定义运行时:

runtime: custom
env: flex

然后:

gcloud app deploy --project=${PROJECT}

工作。