0

Cloud Build 因超时错误而失败(我正在尝试使用 Prophet 部署 CloudRun)。因此,我试图将 Dockerfile 一分为二(将图像保存在两者之间,以防万一失败)。我会像这样拆分 Dockerfile:

  • Dockerfile_one:python + 先知的依赖
  • Dockerfile_two:image_from_Dockerfile_one + 先知 + 其他依赖

cloudbuild.yaml 应该是什么样子:

  1. 如果有以前可用的图像跳过该步骤,否则使用 Dockerfile_one 运行该步骤并保存图像
  2. 使用步骤 (1) 中的映像,向其添加更多依赖项并保存映像以进行部署

这是 cloudbuild.yaml 现在的样子

steps:
#  create gcr source directory
- name: 'bash'
  args:
    - '-c'
    - |
      echo 'Creating gcr_source directory for ${_GCR_NAME}'
      mkdir _gcr_source
      cp -r cloudruns/${_GCR_NAME}/. _gcr_source

# Build the container image
- name: 'gcr.io/cloud-builders/docker'
  args: ['build', '-t', 'gcr.io/$PROJECT_ID/${_GCR_NAME}', '.']
  dir: '_gcr_source'

# Push the container image to Container Registry
- name: 'gcr.io/cloud-builders/docker'
  args: ['push', 'gcr.io/$PROJECT_ID/${_GCR_NAME}']

# Deploy container image to Cloud Run
- name: 'gcr.io/cloud-builders/gcloud'
  entrypoint: gcloud
  args:
  - run
  - deploy
  - ${_GCR_NAME}
  - --image=gcr.io/$PROJECT_ID/${_GCR_NAME}

非常感谢!

4

3 回答 3

1

您需要有 2 条管道

  1. 第一个创建基本映像。像这样,您可以在每次需要重建此基础映像时触发它,其生命周期可能与您的应用程序生命周期不同。类似的东西
steps:
- name: 'gcr.io/cloud-builders/docker'
  args: ['build', '-t', 'gcr.io/<PROJECT_ID>/base-image', '-f', 'DOCKERFILE_ONE', '.']
images: ['gcr.io/<PROJECT_ID>/base-image']
  1. Then, in your second dockerfile, start from the base image and use a second Cloud Build pipeline to build, push and deploy it (as you do in your 3 last steps in your question)
FROM gcr.io/<PROJECT_ID>/base-image
COPY .....
....
...
于 2021-09-01T19:37:34.177 回答
0

不是答案,而是一种解决方法。如果有人有同样的问题,使用 Python3.8 而不是 3.9 为 Cloud Build 工作。

这是 Dockerfile 的样子:

RUN pip install --upgrade pip wheel setuptools

# Install pystan
RUN pip install Cython>=0.22
RUN pip install numpy>=1.7
RUN pip install pystan==2.19.1.1

# Install other prophet dependencies
RUN pip install -r requirements.txt
RUN pip install prophet

虽然弄清楚如何为 CloudRun 迭代构建图像,但真的很棒。

于 2021-08-25T21:29:16.303 回答
0

为什么您的 Cloud Build 因超时错误而失败?

在 docker 中构建图像时,减小图像大小很重要。通常会创建多个 dockerfile 来处理图像大小限制。在您的情况下,您无法减小图像大小并仅包含所需的内容。

可以做些什么来纠正它?

  • 根据本文档,多阶段构建(在 Docker 17.05 中引入)允许您在第一个“构建”容器中构建您的应用程序,并在另一个容器中使用结果,同时使用相同的 Dockerfile。
  • 您在 Dockerfile 中使用多个 FROM 语句。每个 FROM 指令都可以使用不同的基础,并且它们中的每一个都开始构建的新阶段。您可以选择性地将工件从一个阶段复制到另一个阶段,从而在最终图像中留下您不想要的一切。要展示它是如何工作的,请点击此链接
  • 您只需要一个 Dockerfile。
  • 结果是与以前相同的微小生产图像,但复杂性显着降低。您不需要创建任何中间图像,也不需要将任何工件提取到本地系统。

它是如何工作的?

  • 您可以命名您的构建阶段。默认情况下,阶段没有命名,您可以通过它们的整数来引用它们,第一个 FROM 指令从 0 开始。但是,您可以通过在 FROM 指令中添加 AS 来命名您的阶段。
  • 构建镜像时,不一定需要构建整个 Dockerfile,包括每个阶段。您可以指定一个目标构建阶段
  • 使用多阶段构建时,您不仅限于从之前在 Dockerfile 中创建的阶段进行复制。您可以使用 COPY --from 指令从单独的镜像中复制,可以使用本地镜像名称、本地或 Docker 注册表上可用的标签或标签 ID。
  • 在使用 FROM 指令时,您可以通过引用上一阶段停止的位置来继续。
  • Google 文档中,有一个使用多阶段构建的 dockerfile 示例。hello 二进制文件构建在第一个容器中并注入第二个容器。因为第二个容器是基于scratch的,所以生成的镜像只包含 hello 二进制文件,而不包含构建期间所需的源文件和目标文件。
FROM golang:1.10 as builder

WORKDIR /tmp/go
COPY hello.go ./
RUN CGO_ENABLED=0 go build -a -ldflags '-s' -o hello

FROM scratch
CMD [ "/hello" ]
COPY --from=builder /tmp/go/hello /hello
  • 这是一个了解多阶段构建如何工作的教程。
于 2021-08-26T15:07:24.033 回答