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

Kubernetes 如何引用在DAG外部创建的sys.stdout,以便在具有withParam的DAG内部使用?,kubernetes,argo-workflows,argoproj,Kubernetes,Argo Workflows,Argoproj,我正在使用Argo工作流 在我的入口点中有一个DAG步骤,它遵循几个正常步骤。其中一个步骤执行sys.stdout。进入DAG步骤后,我希望一些任务引用来自sys.stdout的结果 我知道如果我们想在工作流从一个步骤转到下一个步骤(没有DAG)时引用sys.stdout,我们可以执行{{steps.step name.outputs.result}。但是,在DAG任务中,同样的方法不起作用 如何在DAG任务中引用sys.stdout,以便与with param一起使用 编辑: 工作流如下所示:

我正在使用Argo工作流

在我的
入口点中有一个DAG步骤,它遵循几个正常步骤。其中一个步骤执行
sys.stdout
。进入DAG步骤后,我希望一些任务引用来自
sys.stdout
的结果

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

如何在DAG任务中引用sys.stdout,以便与
with param
一起使用

编辑:

工作流如下所示:

  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
通常,如果
第三步
执行了
系统标准输出
,我们可以通过
第四步
中的
{{steps.step03.outputs.result}}
引用它。但是,在本例中,
第四步
是一个DAG,如果其中一个DAG任务想要使用
sys.stdout
,则在DAG任务内调用
{steps.step03.outputs.result}
作为参数/参数会抛出错误

问题是如何正确地引用由
third step
生成的
sys.stdout
4th step
DAG任务中?

关于模板输出的一些背景知识 Argo工作流支持许多不同的功能

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

步骤
模板中,您可以使用
步骤.step name.outputs.parameters.param name
(用于命名参数)或
步骤.step name.outputs.result
(用于
脚本
容器
模板的标准输出)访问其他步骤的输出参数

示例():

-名称:输出参数
步骤:
--名称:生成参数
模板:whalesay
--名称:消费参数
模板:打印消息
论据:
参数:
-姓名:信息
值:“{steps.generate parameter.outputs.parameters.hello param}”
dag
模板中,您可以使用类似的语法访问各种任务的输出,只需使用
任务。
而不是
步骤。

示例():

-名称:main
达格:
任务:
-姓名:掷硬币
模板:抛硬币
-姓名:heads
硬币:掷硬币
模板:头
当:“{tasks.flip coin.outputs.result}}==heads”
-姓名:tails
硬币:掷硬币
模板:尾部
当:“{tasks.flip coin.outputs.result}}==tails”
容器
脚本
模板
中,您只能访问该模板的输入*。您不能直接从容器或脚本模板中的步骤或任务模板访问步骤或任务的输出

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

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

模板:
-名称:入口点
步骤:
--名称:step01
模板:第一步
--名称:step02
模板:第二步
--名称:step03
模板:第三步
--名称:步骤04 dag步骤
模板:第四步
论据:
参数:
-姓名:某个参数
值:“{steps.step03.outputs.result}”
-名称:第四步
投入:
参数:
-姓名:某个参数
达格:
任务:
#将第四步模板中的输入参数与“{inputs.parameters.some param}”一起使用
tl;博士
步骤。
任务。
变量用于在单个步骤或任务模板中引用,但可以在模板之间显式传递。如果需要在DAG中使用步骤的输出,请直接将该输出作为调用DAG的参数传递

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


*好的,您还可以从
脚本
容器
模板中访问,但是您不能访问另一个模板中作为内部变量的变量。

您可以粘贴一个示例工作流吗?我不知道你说的进入点的DAG步是什么意思,它遵循几个正常的步骤。我的理解是,一个模板可以有一个DAG或一组步骤,但不能两者都有。事实证明,其中一个(或更多)步骤可以是DAG。最后,我绕过了这个问题,将
sys.stdout
作为DAG步骤的参数,然后在各种DAG任务中使用该参数。谢谢,@michael crenshaw!你说的就是我最后做的。我没有将其输入并建议作为解决方案,因为我认为可能存在允许跨不同模板访问变量的语法。即使没有,我很高兴我没有这么做,因为你比我解释得更好!非常感谢。