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

Gcloud app deploy - problems with .net HelloWorld

我正在学习 gcloud app deploy。我一直在努力 运行 从这个位置获取 .net HelloWorld 示例代码:

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

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

是否还有其他人能够 运行 当前版本的 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 输出的尾端 /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

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

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

gcloud alpha cloud-shell ssh

我克隆了存储库,没有对其进行任何其他更改。

我可以在本地 运行 项目并进行测试:

dotnet run

并且,来自另一个 shell:

curl localhost:8080
Hello World!

NOTE it's unstated (perhaps obvious) but you must dotnet run (better dotnet publish) to create the ./bin/Debug directory.

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

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

NOTE contains app.yaml and HelloWorld.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"]

NOTE using this as a guide.

NOTE I downgraded to 2.1 (rather than 3.1) to avoid a dotnet build error but that's due to my unfamiliarity with the runtime(s).

我把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}

有效。