如何引用在 DAG 外部创建的 sys.stdout,以便在带有 withParam 的 DAG 内部使用?

How to reference sys.stdout created outside of a DAG to be used inside of a DAG with withParam?

我正在使用 Argo 工作流程。

我的 entrypoint 中有一个 DAG 步骤,它遵循几个正常步骤。这些步骤之一执行 sys.stdout。一旦进入 DAG 步骤,我希望一些任务引用 sys.stdout.

的结果

我知道如果我们想在工作流从一个步骤转到下一个步骤(没有 DAG)时引用 sys.stdout,我们可以这样做 {{steps.step-name.outputs.result}}。但是,在 DAG 任务中却不起作用。

如何在 DAG 任务中引用 sys.stdout 以便将其与 withParam 一起使用?

编辑:

工作流程如下所示:

  templates:
  - name: the-entrypoint
    steps:
    - - name: step01
        template: first-step
    - - name: step02
        template: second-step
    - - name: step03
        template: third-step
    - - name: step04-the-dag-step
        template: fourth-step

一般来说,如果third-step做一个sys.stdout,我们可以在fourth-step中引用{{steps.step03.outputs.result}}。但是,在这种情况下 fourth-step 是一个 DAG,如果其中一个 DAG 任务想要使用 sys.stdout,那么在 DAG 任务内部调用 {{steps.step03.outputs.result}} 作为 argument/parameter 会抛出一个错误。

问题是如何在 fourth-step DAG 任务中正确引用 third-step 生成的 sys.stdout

关于模板输出的一些背景知识

Argo Workflows 支持多种不同的types of templates

每种类型的模板在模板中支持不同类型的引用

steps 模板 中,您可以使用 steps.step-name.outputs.parameters.param-name(对于命名参数)或 steps.step-name.outputs.result 访问其他步骤的输出参数(对于 scriptcontainer 模板的标准输出)。

示例 (see full Workflow):

  - name: output-parameter
    steps:
    - - name: generate-parameter
        template: whalesay
    - - name: consume-parameter
        template: print-message
        arguments:
          parameters:
          - name: message
            value: "{{steps.generate-parameter.outputs.parameters.hello-param}}"

dag 模板 中,您可以使用类似的语法访问各种任务的输出,只需使用 tasks. 而不是 steps..

示例 (see full Workflow):

    - name: main
      dag:
        tasks:
          - name: flip-coin
            template: flip-coin
          - name: heads
            depends: flip-coin
            template: heads
            when: "{{tasks.flip-coin.outputs.result}} == heads"
          - name: tails
            depends: flip-coin
            template: tails
            when: "{{tasks.flip-coin.outputs.result}} == tails"

containerscript模板中,您可以仅访问该模板的输入* .您不能直接从容器或脚本模板的步骤或任务模板访问步骤或任务的输出。

引用 DAG 的步骤输出

如上所述,DAG 模板不能直接引用 steps 模板的步骤输出。但是 steps 模板中的步骤可以 将步骤输出传递给 DAG 模板

在您的示例中,它看起来像这样:

  templates:
  - name: the-entrypoint
    steps:
    - - name: step01
        template: first-step
    - - name: step02
        template: second-step
    - - name: step03
        template: third-step
    - - name: step04-the-dag-step
        template: fourth-step
        arguments:
          parameters:
          - name: some-param
            value: "{{steps.step03.outputs.result}}"
  - name: fourth-step
    inputs:
      parameters:
      - name: some-param
    dag:
      tasks:
        # use the input parameter in the fourth-step template with "{{inputs.parameters.some-param}}"

tl;博士

steps.tasks. 变量旨在 在单个步骤或任务模板中引用 ,但它们可以显式 在模板之间传递。如果您需要使用 DAG 中某个步骤的输出,请直接将该输出作为调用 DAG 的参数传递。

在您的例子中,DAG 模板作为四个步骤的最后一步被调用,因此您将在此处传递参数。

* 好的,您还可以从 scriptcontainer 模板中访问 various other variables,但您无权访问以下变量作用域为另一个模板中的内部变量。