使用 Flex 模板打包 Dataflow 流水线以进行部署

本页面介绍了如何为 Dataflow 流水线创建 Flex 模板。借助 Flex 模板,您可以打包 Apache Beam 流水线代码,以便在没有开发环境的情况下运行流水线。通过创建 Flex 模板,任何具有正确权限的用户都可以将您的流水线作为 Dataflow 作业运行。

如需查看有关创建和运行 Flex 模板的端到端教程,请参阅构建和运行示例 Flex 模板

概览

Flex 模板由以下组件组成:

  • 存储在 Artifact Registry 中的容器映像。 容器负责启动 Dataflow 作业。

  • 存储在 Cloud Storage 中的 JSON 规范文件。此文件包含指向容器映像的指针和其他元数据。

在创建 Flex 模板之前,您必须使用 Apache Beam SDK 编写流水线代码。如需了解详情,请参阅使用 Apache Beam 构建流水线

必须在调用 run 后退出用于构建流水线的程序,流水线才能启动。请勿调用 waitUntilFinish (Java) 或 wait_until_finish (Python),因为这些函数会阻塞并阻止 Flex 模板运行。

所需权限

如需获得构建 Flex 模板所需的权限,请让管理员向您授予项目的以下 IAM 角色:

如需详细了解如何授予角色,请参阅管理对项目、文件夹和组织的访问权限

您也可以通过自定义角色或其他预定义角色来获取所需的权限。

模板元数据

您可以选择为模板提供其他元数据,包括以下内容:

  • 流水线参数:声明流水线使用的任何自定义流水线选项。当您提交 Flex 模板作业时,Dataflow 会验证参数。如果您使用Google Cloud 控制台运行模板,则基于模板创建作业对话框会包含元数据中声明的流水线参数。

  • 流式传输支持:您可以指定流水线是否支持流式传输,如果支持,则指定是支持“正好一次”模式还是“至少一次”模式。此元数据使 Google Cloud 控制台能够在您运行模板时显示相关的流水线选项。

如需添加其他元数据,请创建一个包含元数据参数的 JSON 文件。在 gcloud dataflow flex-template build 命令的 --metadata-file 标志中指定此文件。元数据文件的内容会合并到模板规范文件中。如需了解详情,请参阅构建 Flex 模板

元数据参数

参数键 必需 值的说明
name 模板的名称。
description 对模板进行说明的一小段文本。
streaming 如果为 true,则此模板支持流处理。默认值为 false
supportsAtLeastOnce 如果为 true,则此模板支持“至少一次”处理。默认值为 false。如果模板设计为支持“至少一次”流处理模式,请将此参数设置为 true
supportsExactlyOnce 如果为 true,则此模板支持“正好一次”处理。默认值为 true
defaultStreamingMode 默认流处理模式,适用于同时支持“至少一次”模式和“正好一次”模式的模板。请使用以下某个值:"AT_LEAST_ONCE""EXACTLY_ONCE"。如果未指定,则默认流处理模式为“正好一次”。
parameters 模板使用的一组附加参数。默认情况下,使用空数组。
name 模板中使用的参数的名称。
label 人类可读的字符串,用于在 Google Cloud 控制台中标记参数。
helpText 对参数进行说明的一小段文本。
isOptional 如果参数是必需的,则为 false;如果参数是可选的,则为 true。除非设置了值,否则 isOptional 默认为 false。 如果您没有为元数据添加此参数键,则元数据会成为必需参数。
regexes 一组字符串形式的 POSIX-egrep 正则表达式(用于验证参数的值)。例如,["^[a-zA-Z][a-zA-Z0-9]+"] 是一个正则表达式,用于验证以字母开头,并且包含一个或多个字符的值。默认使用空数组。

示例元数据文件

Java

{
  "name": "Streaming Beam SQL",
  "description": "An Apache Beam streaming pipeline that reads JSON encoded messages from Pub/Sub, uses Beam SQL to transform the message data, and writes the results to a BigQuery",
  "parameters": [
    {
      "name": "inputSubscription",
      "label": "Pub/Sub input subscription.",
      "helpText": "Pub/Sub subscription to read from.",
      "regexes": [
        "[a-zA-Z][-_.~+%a-zA-Z0-9]{2,}"
      ]
    },
    {
      "name": "outputTable",
      "label": "BigQuery output table",
      "helpText": "BigQuery table spec to write to, in the form 'project:dataset.table'.",
      "isOptional": true,
      "regexes": [
        "[^:]+:[^.]+[.].+"
      ]
    }
  ]
}

Python

{
  "name": "Streaming beam Python flex template",
  "description": "Streaming beam example for python flex template.",
  "parameters": [
    {
      "name": "input_subscription",
      "label": "Input PubSub subscription.",
      "helpText": "Name of the input PubSub subscription to consume from.",
      "regexes": [
        "projects/[^/]+/subscriptions/[a-zA-Z][-_.~+%a-zA-Z0-9]{2,}"
      ]
    },
    {
      "name": "output_table",
      "label": "BigQuery output table name.",
      "helpText": "Name of the BigQuery output table name.",
      "isOptional": true,
      "regexes": [
        "([^:]+:)?[^.]+[.].+"
      ]
    }
  ]
}

您可以从 Dataflow 模板目录下载 Google 提供的模板的元数据文件。

环境变量

构建 Flex 模板时,在 gcloud dataflow flex-template build 命令的 --env 标志中指定以下环境变量。如果您使用的是自定义映像,请在 Dockerfile 中设置这些环境变量。

Java

ENV 说明 必需
FLEX_TEMPLATE_JAVA_MAIN_CLASS 指定启动 Flex 模板要运行的 Java 类。
FLEX_TEMPLATE_JAVA_CLASSPATH 指定类文件的位置。
FLEX_TEMPLATE_JAVA_OPTIONS 指定启动 Flex 模板时要传递的 Java 选项。

在 Dockerfile 中指定 FLEX_TEMPLATE_JAVA_MAIN_CLASSFLEX_TEMPLATE_JAVA_CLASSPATH

Python

ENV 说明 必需
FLEX_TEMPLATE_PYTHON_PY_FILE 指定启动 Flex 模板要运行的 Python 文件。
FLEX_TEMPLATE_PYTHON_REQUIREMENTS_FILE 指定包含流水线依赖项的需求文件。 如需了解详情,请参阅 Apache Beam 文档中的 PyPI 依赖项
FLEX_TEMPLATE_PYTHON_SETUP_FILE 指定流水线软件包“setup.py”文件的路径。 如需了解详情,请参阅 Apache Beam 文档中的多个文件依赖项
FLEX_TEMPLATE_PYTHON_EXTRA_PACKAGES

指定不公开提供的软件包。如需了解如何使用额外的软件包,请参阅本地或非 PyPI 依赖项

FLEX_TEMPLATE_PYTHON_PY_OPTIONS 指定启动 Flex 模板时要传递的 Python 选项。

在 Dockerfile 中指定 FLEX_TEMPLATE_PYTHON_PY_FILE

如需管理流水线依赖项,请在 Dockerfile 中设置变量,例如:

  • FLEX_TEMPLATE_PYTHON_REQUIREMENTS_FILE
  • FLEX_TEMPLATE_PYTHON_PY_OPTIONS
  • FLEX_TEMPLATE_PYTHON_SETUP_FILE
  • FLEX_TEMPLATE_PYTHON_EXTRA_PACKAGES

例如,我们在 GitHub 的 Streaming in Python Flex 模板教程中设置了以下环境变量:

ENV FLEX_TEMPLATE_PYTHON_REQUIREMENTS_FILE="${WORKDIR}/requirements.txt"
ENV FLEX_TEMPLATE_PYTHON_PY_FILE="${WORKDIR}/streaming_beam.py"

Go

ENV 说明 必需
FLEX_TEMPLATE_GO_BINARY 指定要运行的 Go 二进制文件。

在 Dockerfile 中指定 FLEX_TEMPLATE_GO_BINARY

Flex 模板映像

Flex 模板包含一个用于启动 Dataflow 流水线的容器映像。运行 Flex 模板作业时,Dataflow 服务会从 Artifact Registry 下载容器映像并启动容器。容器负责启动 Dataflow 作业。

Google 维护了一组可供您使用的 Flex 模板基础映像。不过,如果流水线需要自定义容器映像,我们建议为 Flex 模板使用相同的映像。这样一来,Flex 模板启动器便会包含与流水线运行时容器相同的依赖项。

自定义容器映像

如需创建自定义 Flex 模板映像,请在 Dockerfile 中添加以下步骤:

  • 将 Flex 模板启动器二进制文件从其中一个 Google 提供的基础映像复制到您的映像。启动器二进制文件位于以下路径中:

    Java

    /opt/google/dataflow/java_template_launcher

    Python

    /opt/google/dataflow/python_template_launcher

    Go

    /opt/google/dataflow/go_template_launcher

  • 复制启动流水线作业所需的制品,例如 Python 文件、JAR 文件或 Go 二进制文件。

  • 设置环境变量中列出的环境变量。

以下示例展示了 Python 流水线的 Dockerfile:

# Flex Template base image. Used here to get the launcher binary.
FROM gcr.io/dataflow-templates-base/IMAGE_NAME:TAG as template_launcher

# Apache Beam SDK image. This is the base image for the pipeline job.
FROM apache/beam_python3.10_sdk:2.69.0

# Customize the image for your pipeline.
# [...]

# Configure the Flex Template.
COPY --from=template_launcher /opt/google/dataflow/python_template_launcher /opt/google/dataflow/python_template_launcher
COPY my_pipeline.py /template/
ENV FLEX_TEMPLATE_PYTHON_PY_FILE="/template/my_pipeline.py"

替换以下内容:

  • IMAGE_NAME:Google 提供的基础映像。例如:python311-template-launcher-base
  • TAGFlex 模板基础映像中列出的基础映像的版本标记。 为了提高稳定性和问题排查,请避免使用 latest。请改为固定到特定版本标记。

如需查看遵循此方法的教程,请参阅具有依赖项和自定义容器映像的流水线 Flex 模板

构建 Flex 模板

如需构建 Flex 模板,请使用 gcloud dataflow flex-template build 命令。此命令会创建以下制品:

  • 存储在 Cloud Storage 中的模板规范文件
  • 启动器容器映像,存储在 Artifact Registry 中

使用 Google 提供的基础映像

如需使用 Google 提供的基础映像运行 Flex 模板,请运行以下命令:

Java

gcloud dataflow flex-template build gs://BUCKET_NAME/TEMPLATE_FILE_NAME \
  --image-gcr-path "LOCATION-docker.pkg.dev/PROJECT_ID/REPOSITORY/IMAGE:TAG" \
  --sdk-language "JAVA" \
  --flex-template-base-image "BASE_IMAGE" \
  --metadata-file "METADATA_FILE" \
  --jar "JAR_FILE" \
  --env "FLEX_TEMPLATE_JAVA_MAIN_CLASS=JAVA_MAIN_CLASS"

替换以下内容:

  • BUCKET_NAME:用于存储模板规范文件的 Cloud Storage 存储桶的名称
  • TEMPLATE_FILE_NAME:要创建的模板规范文件的名称。示例:my_template.json
  • LOCATION:Artifact Registry 代码库的位置
  • PROJECT_ID: Google Cloud 项目 ID
  • REPOSITORY:您的 Artifact Registry 代码库的名称
  • IMAGE:Flex 模板容器映像的名称
  • TAG:Flex 模板容器映像的标记
  • <pBASE_IMAGE: the base image to use. Specify one of the following:

    • A predefined label, such as "JAVA17". For more information, see the documentation for the --flex-template-base-image flag.
    • The full gcr.io path to a specific container version, in the following format: gcr.io/dataflow-templates-base/IMAGE:TAG.
  • METADATA_FILE:元数据文件的本地路径。如需了解详情,请参阅模板元数据
  • JAR_FILE:流水线代码的 JAR 文件的本地路径。如果有多个 JAR 文件,请将其格式设置为以逗号分隔的列表,或在单独的 --jar 标志中指定这些文件。
  • JAVA_MAIN_CLASS:要运行的 Java 类的名称。如需了解详情,请参阅环境变量

Python

gcloud dataflow flex-template build gs://BUCKET_NAME/TEMPLATE_FILE_NAME \
  --image-gcr-path "LOCATION-docker.pkg.dev/PROJECT_ID/REPOSITORY/IMAGE:TAG" \
  --sdk-language "PYTHON" \
  --flex-template-base-image "BASE_IMAGE" \
  --metadata-file "METADATA_FILE" \
  --py-path "PYTHON_FILE_PATH" \
  --env "FLEX_TEMPLATE_PYTHON_PY_FILE=PYTHON_FILE"

替换以下内容:

  • BUCKET_NAME:用于存储模板规范文件的 Cloud Storage 存储桶的名称
  • TEMPLATE_FILE_NAME:要创建的模板规范文件的名称。示例:my_template.json
  • LOCATION:Artifact Registry 代码库的位置
  • PROJECT_ID: Google Cloud 项目 ID
  • REPOSITORY:您的 Artifact Registry 代码库的名称
  • IMAGE:Flex 模板容器映像的名称
  • TAG:Flex 模板容器映像的标记
  • <pBASE_IMAGE: the base image to use. Specify one of the following:

    • A predefined label, such as "PYTHON3". For more information, see the documentation for the --flex-template-base-image flag.
    • The full gcr.io path to a specific container version, in the following format: gcr.io/dataflow-templates-base/IMAGE:TAG.
  • METADATA_FILE:元数据文件的本地路径。如需了解详情,请参阅模板元数据
  • PYTHON_FILE_PATH:流水线的 Python 文件及其所有依赖文件的本地路径。您可以采用逗号分隔列表的形式或单独的 --py-path 标志来指定多个路径。
  • PYTHON_FILE:要运行的 Python 文件。如需了解详情,请参阅环境变量

Go

gcloud dataflow flex-template build gs://BUCKET_NAME/TEMPLATE_FILE_NAME \
  --image-gcr-path "LOCATION-docker.pkg.dev/PROJECT_ID/REPOSITORY/IMAGE:TAG" \
  --sdk-language "GO" \
  --flex-template-base-image "BASE_IMAGE" \
  --metadata-file "METADATA_FILE" \
  --go-binary-path="GO_FILE_PATH" \
  --env "FLEX_TEMPLATE_GO_BINARY=GO_BINARY"

替换以下内容:

  • BUCKET_NAME:用于存储模板规范文件的 Cloud Storage 存储桶的名称
  • TEMPLATE_FILE_NAME:要创建的模板规范文件的名称。示例:my_template.json
  • LOCATION:Artifact Registry 代码库的位置
  • PROJECT_ID: Google Cloud 项目 ID
  • REPOSITORY:您的 Artifact Registry 代码库的名称
  • IMAGE:Flex 模板容器映像的名称
  • TAG:Flex 模板容器映像的标记
  • <pBASE_IMAGE: the base image to use. Specify one of the following:

    • A predefined label, such as "GO". For more information, see the documentation for the --flex-template-base-image flag.
    • The full gcr.io path to a specific container version, in the following format: gcr.io/dataflow-templates-base/IMAGE:TAG.
  • METADATA_FILE:元数据文件的本地路径。如需了解详情,请参阅模板元数据
  • GO_FILE_PATH:已编译的流水线 Go 二进制文件的本地路径
  • GO_BINARY:要运行的 Go 二进制文件。如需了解详情,请参阅环境变量

使用自定义映像

如需使用自定义容器映像运行 Flex 模板,请运行以下命令:

Java

gcloud dataflow flex-template build gs://BUCKET_NAME/TEMPLATE_FILE_NAME \
  --image "CUSTOM_IMAGE" \
  --sdk-language "JAVA" \
  --metadata-file "METADATA_FILE"

Python

gcloud dataflow flex-template build gs://BUCKET_NAME/TEMPLATE_FILE_NAME \
  --image "CUSTOM_IMAGE" \
  --sdk-language "PYTHON" \
  --metadata-file "METADATA_FILE"

Go

gcloud dataflow flex-template build gs://BUCKET_NAME/TEMPLATE_FILE_NAME \
  --image "CUSTOM_IMAGE" \
  --sdk-language "GO" \
  --metadata-file "METADATA_FILE"

替换以下内容:

  • BUCKET_NAME:用于存储模板规范文件的 Cloud Storage 存储桶的名称。

  • TEMPLATE_FILE_NAME:模板规范文件的名称。示例:my_template.json

  • CUSTOM_IMAGE:自定义映像的映像注册表位置。

  • METADATA_FILE元数据文件的本地路径。

Python 的软件包依赖项

如果 Dataflow Python 流水线使用其他依赖项,您可能需要配置 Flex 模板,以便在 Dataflow 工作器虚拟机上安装其他依赖项。

如果在限制互联网访问的环境中运行使用 Flex 模板的 Python Dataflow 作业,则您必须在创建模板时预封装依赖项。

使用以下任一选项预封装 Python 依赖项。

如需了解如何在 Java 和 Go 流水线中管理流水线依赖项,请参阅在 Dataflow 中管理流水线依赖项

使用需求文件并使用模板预封装依赖项

如果您使用自己的 Dockerfile 来定义 Flex 模板映像,请按以下步骤操作:

  1. 创建一个列出流水线依赖项的 requirements.txt 文件。

    COPY requirements.txt /template/
    ENV FLEX_TEMPLATE_PYTHON_REQUIREMENTS_FILE="/template/requirements.txt"
    
  2. 在 Flex 模板映像中安装依赖项。

    RUN pip install --no-cache-dir -r $FLEX_TEMPLATE_PYTHON_REQUIREMENTS_FILE
    
  3. 将依赖项下载到本地要求缓存中,该缓存会在模板启动时暂存到 Dataflow 工作器。

    RUN pip download --no-cache-dir --dest /tmp/dataflow-requirements-cache -r $FLEX_TEMPLATE_PYTHON_REQUIREMENTS_FILE
    

使用此方法时,系统会在运行时将 requirements.txt 文件中的依赖项安装到 Dataflow 工作器上。 Google Cloud 控制台“建议”标签页中的分析洞见可能会指出此行为。为避免在运行时安装依赖项,请使用自定义容器映像

以下是使用Flex 模板中的 requirements 文件的代码示例。

# Copyright 2020 Google LLC
#
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
# You may obtain a copy of the License at
#
#    http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.

FROM gcr.io/dataflow-templates-base/python3-template-launcher-base

# Configure the Template to launch the pipeline with a --requirements_file option.
# See: https://beam.apache.org/documentation/sdks/python-pipeline-dependencies/#pypi-dependencies
ENV FLEX_TEMPLATE_PYTHON_REQUIREMENTS_FILE="/template/requirements.txt"
ENV FLEX_TEMPLATE_PYTHON_PY_FILE="/template/streaming_beam.py"

COPY . /template

RUN apt-get update \
    # Install any apt packages if required by your template pipeline.
    && apt-get install -y libffi-dev git \
    && rm -rf /var/lib/apt/lists/* \
    # Upgrade pip and install the requirements.
    && pip install --no-cache-dir --upgrade pip \
    # Install dependencies from requirements file in the launch environment.
    && pip install --no-cache-dir -r $FLEX_TEMPLATE_PYTHON_REQUIREMENTS_FILE \
    # When FLEX_TEMPLATE_PYTHON_REQUIREMENTS_FILE  option is used,
    # then during Template launch Beam downloads dependencies
    # into a local requirements cache folder and stages the cache to workers.
    # To speed up Flex Template launch, pre-download the requirements cache
    # when creating the Template.
    && pip download --no-cache-dir --dest /tmp/dataflow-requirements-cache -r $FLEX_TEMPLATE_PYTHON_REQUIREMENTS_FILE

# Set this if using Beam 2.37.0 or earlier SDK to speed up job submission.
ENV PIP_NO_DEPS=True

ENTRYPOINT ["/opt/google/dataflow/python_template_launcher"]

将流水线结构设计为软件包并使用本地软件包

如果您使用多个 Python 本地文件或模块,请将流水线结构化为软件包。文件结构可能如下所示:

main.py
pyproject.toml
setup.py
src/
  my_package/
    __init__.py
    my_custom_dofns_and_transforms.py
    my_pipeline_launcher.py
    other_utils_and_helpers.py
  1. 将顶级入口点(例如 main.py 文件)放置在根目录中。将其余文件放在 src 目录中的单独文件夹中,例如 my_package

  2. 将软件包配置文件添加到根目录,并提供软件包详情和要求。

    pyproject.toml

    [project]
    name = "my_package"
    version = "package_version"
    dependencies = [
      # Add list of packages (and versions) that my_package depends on.
      # Example:
      "apache-beam[gcp]==2.54.0",
    ]
    

    setup.py

      """An optional setuptools configuration stub for the pipeline package.
    
      Use pyproject.toml to define the package. Add this file only if you must
      use the --setup_file pipeline option or the
      FLEX_TEMPLATE_PYTHON_SETUP_FILE configuration option.
      """
    
      import setuptools
      setuptools.setup()
    

    如需详细了解如何配置本地软件包,请参阅打包 Python 项目

  3. 为流水线导入本地模块或文件时,请使用 my_package 软件包名称作为导入路径。

    from my_package import word_count_transform
    
  4. 在 Flex 模板映像中安装流水线软件包。您的 Flex 模板 Dockerfile 可能包含类似于以下示例的内容:

    Dockerfile

    ENV FLEX_TEMPLATE_PYTHON_PY_FILE="${WORKDIR}/main.py"
    ENV FLEX_TEMPLATE_PYTHON_SETUP_FILE="${WORKDIR}/setup.py"
    
    # Copy pipeline, packages and requirements.
    WORKDIR ${WORKDIR}
    COPY main.py .
    COPY pyproject.toml .
    COPY setup.py .
    COPY src src
    
    # Install local package.
    RUN pip install -e .
    

使用此方法时,系统会在运行时将 requirements.txt 文件中的依赖项安装到 Dataflow 工作器上。 Google Cloud 控制台“建议”标签页中的分析洞见可能会指出此行为。为避免在运行时安装依赖项,请使用自定义容器映像

如需查看遵循推荐方法的示例,请参阅 GitHub 中的具有依赖项和自定义容器映像的流水线 Flex 模板教程。

使用预安装所有依赖项的自定义容器

如需避免在运行时安装依赖项,请使用自定义容器。对于在不访问互联网的环境中运行的流水线,首选此选项。

如需使用自定义容器,请按以下步骤操作:

  1. 构建一个预安装必要依赖项的自定义容器映像。

  2. 在 Flex 模板 Dockerfile 中预安装相同的依赖项。

    如需防止在运行时安装依赖项,请勿在 Flex 模板配置中使用 FLEX_TEMPLATE_PYTHON_REQUIREMENTS_FILEFLEX_TEMPLATE_PYTHON_SETUP_FILE 选项。

    修改后的 Flex 模板 Dockerfile 可能如以下示例所示:

    FROM gcr.io/dataflow-templates-base/python3-template-launcher-base
    ENV FLEX_TEMPLATE_PYTHON_PY_FILE="/template/main.py"
    COPY . /template
    # If you use a requirements file, pre-install the requirements.txt.
    RUN pip install --no-cache-dir -r /template/requirements.txt
    # If you supply the pipeline in a package, pre-install the local package and its dependencies.
    RUN pip install -e /template
    

    使用此方法时,您需要执行以下操作:

    • 构建 Flex 模板映像
    • 构建自定义 SDK 容器映像
    • 在两个映像中安装相同的依赖项

    或者,为了减少需要维护的映像数量,请将自定义容器映像用作 Flex 模板的基础映像

  3. 如果您使用 Apache Beam SDK 2.49.0 版或更低版本,请在流水线启动器中添加 --sdk_location=container 流水线选项。此选项会指示流水线使用自定义容器中的 SDK,而不是下载 SDK。

    options = PipelineOptions(beam_args, save_main_session=True, streaming=True, sdk_location="container")
    
  4. flex-template run 命令中设置 sdk_container_image 参数。例如:

    gcloud dataflow flex-template run $JOB_NAME \
       --region=$REGION \
       --template-file-gcs-location=$TEMPLATE_PATH \
       --parameters=sdk_container_image=$CUSTOM_CONTAINER_IMAGE \
       --additional-experiments=use_runner_v2
    

    如需了解详情,请参阅在 Dataflow 中使用自定义容器

将私有 Docker 注册表与 Flex 模板搭配使用

您可以构建存储在私有 Docker 注册表中的 Flex 模板映像,条件是该私有注册表使用 HTTPS 并且具有有效证书。

如需使用私有注册表中的映像,请指定该映像的路径以及该注册表的用户名和密码。用户名和密码必须存储在 Secret Manager 中。您可以使用以下格式之一提供密文:

  • projects/{project}/secrets/{secret}/versions/{secret_version}
  • projects/{project}/secrets/{secret}

如果您使用第二种格式,因为它未指定版本,则 Dataflow 会使用最新版本。

如果注册表使用自签名证书,您还需要指定自签名证书的 Cloud Storage 路径。

下表介绍了可用于配置私有注册表的 gcloud CLI 选项。

参数 说明
image 注册表的地址。例如:gcp.repository.example.com:9082/registry/example/image:latest
image-repository-username-secret-id 用于向私有注册表进行身份验证的用户名的 Secret Manager 密文 ID。例如:projects/example-project/secrets/username-secret
image-repository-password-secret-id 用于向私有注册表进行身份验证的密码的 Secret Manager 密文 ID。例如:projects/example-project/secrets/password-secret/versions/latest
image-repository-cert-path 私有注册表的自签名证书的完整 Cloud Storage 网址。仅当注册表使用自签名证书时,才需要填写此值。例如:gs://example-bucket/self-signed.crt

下面是一个示例 Google Cloud CLI 命令,该命令使用具有自签名证书的私有注册表中的映像构建 Flex 模板。

gcloud dataflow flex-template build gs://example-bucket/custom-pipeline-private-repo.json
--sdk-language=JAVA
--image="gcp.repository.example.com:9082/registry/example/image:latest"
--image-repository-username-secret-id="projects/example-project/secrets/username-secret"
--image-repository-password-secret-id="projects/example-project/secrets/password-secret/versions/latest"
--image-repository-cert-path="gs://example-bucket/self-signed.crt"
--metadata-file=metadata.json

如需构建您自己的 Flex 模板,您需要替换示例值,并且可能需要指定不同的选项或额外指定一些选项。

后续步骤