无法构建 Docker 容器并将其部署到云 运行

Trouble Building and Deploying a Docker Container to Cloud Run

我有几个 Cloud 运行 服务已经运行了几个月。但是,我昨天尝试对服务进行一些更新,突然间我从一开始就使用的脚本不再起作用了。

gcloud 构建提交

我一直在使用以下命令通过远程 docker 容器构建我的 node/npm 项目:

gcloud builds submit --tag gcr.io/PROJECT_ID/generator

我有一个 docker 文件和 .dockerignore 在与我的 package.json 相同的目录中,从那里我 运行 这个脚本。然而,昨天我突然开始收到一个错误,上面写着使用 --tag 参数时需要 docker 文件并且图像无法构建。

暂定方案

经过一些研究,我尝试将我的构建 cnfig 移动到 gcloudbuild-staging.json,它看起来像这样:

{
  "steps": [
    {
      "name": "gcr.io/cloud-builders/docker",
      "args": [
        "build",
        "-t",
        "gcr.io/PROJECT_ID/generator",
        "."
      ]
    }
  ]
}

我已将我的构建脚本更改为:

gcloud builds submit --config=./gcloudbuild-staging.json

执行此操作后,容器将构建 - 或者据我所知。控制台输出如下所示:

------------------------------------------------- REMOTE BUILD OUTPUT --------------------------------------------------
starting build "8ca1af4c-d337-4349-959f-0000577e4528"

FETCHSOURCE
Fetching storage object: gs://PROJECT_ID/source/1650660913.623365-8a689bcf007749b7befa6e21ab9086dd.tgz#1650660991205773
Copying gs://PROJECT_ID/source/1650660913.623365-8a689bcf007749b7befa6e21ab9086dd.tgz#1650660991205773...
/ [0 files][    0.0 B/ 22.2 MiB]                                                
/ [1 files][ 22.2 MiB/ 22.2 MiB]                                                
-
Operation completed over 1 objects/22.2 MiB.
BUILD
Already have image (with digest): gcr.io/cloud-builders/docker
Sending build context to Docker daemon  785.4kB

Step 1/6 : FROM node:14-slim
14-slim: Pulling from library/node
8bd3f5a20b90: Pulling fs layer
3a665e454db5: Pulling fs layer
11fcaa1377c4: Pulling fs layer
bf0a7233d366: Pulling fs layer
0d4d73621610: Pulling fs layer
bf0a7233d366: Waiting
0d4d73621610: Waiting
3a665e454db5: Verifying Checksum
3a665e454db5: Download complete
bf0a7233d366: Verifying Checksum
bf0a7233d366: Download complete
8bd3f5a20b90: Verifying Checksum
8bd3f5a20b90: Download complete
0d4d73621610: Verifying Checksum
0d4d73621610: Download complete
11fcaa1377c4: Verifying Checksum
11fcaa1377c4: Download complete
8bd3f5a20b90: Pull complete
3a665e454db5: Pull complete
11fcaa1377c4: Pull complete
bf0a7233d366: Pull complete
0d4d73621610: Pull complete
Digest: sha256:9ea3dfdff723469a060d1fa80577a090e14ed28157334d649518ef7ef8ba5b9b
Status: Downloaded newer image for node:14-slim
 ---> 913d072dc4d9
Step 2/6 : WORKDIR /usr/src/app
 ---> Running in 96bc104b9501
Removing intermediate container 96bc104b9501
 ---> 3b1b05ea0470
Step 3/6 : COPY package*.json ./
 ---> a6eca4a75ddd
Step 4/6 : RUN npm ci --only=production
 ---> Running in 7e870db13a9b

> protobufjs@6.11.2 postinstall /usr/src/app/node_modules/protobufjs
> node scripts/postinstall

added 237 packages in 7.889s
Removing intermediate container 7e870db13a9b
 ---> 6a86cc961a09
Step 5/6 : COPY . ./
 ---> 9e1f0f7a69a9
Step 6/6 : CMD [ "node", "index.js" ]
 ---> Running in d1b4d054a974
Removing intermediate container d1b4d054a974
 ---> 672075ef5897
Successfully built 672075ef5897
Successfully tagged gcr.io/PROJECT_ID/generator:latest
PUSH
DONE
------------------------------------------------------------------------------------------------------------------------
ID                                    CREATE_TIME                DURATION  SOURCE                                                                                                    IMAGES  STATUS
8ca1af4c-d337-4349-959f-0000577e4528  2022-04-22T20:56:31+00:00  31S       gs://PROJECT_ID/source/1650660913.623365-8a689bcf007749b7befa6e21ab9086dd.tgz  -       SUCCESS

在线日志中没有错误。

gcloud 运行 部署

这是我用来部署容器的代码:

gcloud run deploy generator --image gcr.io/PROJECT_ID/generator --region=us-central1 --set-env-vars ENVIRONMENT=DEV

控制台输出为:

Deploying container to Cloud Run service [generator] in project [PROJECT_ID] region [us-central1]
✓ Deploying... Done.
  ✓ Creating Revision...
  ✓ Routing traffic...
Done.
Service [generator] revision [generator-00082-kax] has been deployed and is serving 100 percent of traffic.
Service URL: https://generator-SERVICE_ID-uc.a.run.app

运行 控制台也没有错误。它显示部署,好像一切都很好。

问题

一切都没有改变。在本地,运行将此服务与访问它的前端应用程序结合使用会产生成功的结果。但是,我在 Firebase 上托管的应用程序的暂存版本仍在运行,就好像旧版本的代码处于活动状态一样。

我试过的

我最后一次成功部署是在 2022 年 3 月 19 日。自从他们以来,我唯一做的就是更新我所有的 WSL linux 应用程序——其中包括 gcloud。我不知道我之前使用的是什么版本,但我现在使用的是 Google Cloud CLI 的 38.0.0。

我已尝试搜索我的问题,但未找到任何相关信息。我完全不知道为什么所有这些都停止工作并且我没有收到任何错误。我可以提供任何建议或更多信息吗?

gcloud builds submit 应该 (!?) 继续使用 --tag,只要您 运行 从中创建的文件夹中有 Dockerfile命令或您明确指定源文件夹。

我不是在质疑您收到了错误,但查看您使用的命令和导致的错误会很有帮助。您不应该需要切换到构建配置文件。虽然这不是问题。

使用 latest 作为标签值具有挑战性。该术语表明将使用最新版本的容器映像,但经常不会发生这种情况。当像 Cloud 运行 这样的服务正在 运行 标记了 latest 的图像并且开发人员要求该服务 运行 时,这尤其具有挑战性 - 开发人员知道什么(!)是不同的图像 -- 但也标记为 latest.

就大多数服务而言,相同的标签意味着相同的图像,因此可能 (!) Cloud 运行 没有找到不同的图像,或者您没有为其提供不同的图像.我不清楚出现的是哪种替代方案,但我相信您对 latest 的使用导致了您的一些问题。

所以...对于初学者,请考虑使用这样一种系统,在该系统中,每次创建新容器时,您都会使用唯一标识符对其进行标记。一种常见的方法是使用提交哈希(因为这些随着每次提交而改变)。或者,您可以使用容器的摘要(而不是标签)来引用图像版本。这需要 {IMG}@sha256:{HASH}.

形式的图像引用

最后,gcloud run 现在(一直?)支持从源(文件夹)部署到 运行ning 服务(它为您执行 Cloud Build 过程并将结果部署到 Cloud 运行。可能值得使用此流程来减少您的步骤,从而减少出错的可能性。

参见:Deploying from source code