如何访问作为输入工件传递给 argo 工作流中的脚本模板的文件内容

How to access a content of file which is passed as input artifact to a script template in argo workflows

我正在尝试访问作为输入项目传递给脚本模板的文件的内容(json 数据)。它因以下错误而失败 NameError: name 'inputs' is not defined. Did you mean: 'input'?

我的工件存储在 aws s3 存储桶中。我也尝试过使用环境变量而不是直接在脚本模板中直接引用工件,但它也不起作用。

这是我的工作流程

apiVersion: argoproj.io/v1alpha1
kind: Workflow
metadata:
  generateName: output-artifact-s3-
spec:
  entrypoint: main
  templates:
    - name: main
      dag:
        tasks:
          - name: whalesay-script-template
            template: whalesay

          - name: retrieve-output-template
            dependencies: [whalesay-script-template]
            arguments:
              artifacts:
                - name: result
                  from: "{{tasks.whalesay-script-template.outputs.artifacts.message}}"
            template: retrieve-output


    - name: whalesay
      script:
        image: python
        command: [python]
        env:
          - name: OUTDATA
            value: |
              {
              "lb_url" : "<>.us-east-1.elb.amazonaws.com",
              "vpc_id" : "<vpc-id",
              "web_server_count" : "4"
              }
        source: |
          import json
          import os
          OUTDATA = json.loads(os.environ["OUTDATA"])
          with open('/tmp/templates_lst.txt', 'w') as outfile:
            outfile.write(str(json.dumps(OUTDATA)))
        volumeMounts:
          - name: out
            mountPath: /tmp
      volumes:
        - name: out
          emptyDir: { }
      outputs:
        artifacts:
          - name: message
            path: /tmp


    - name: retrieve-output
      inputs:
        artifacts:
          - name: result
            path: /tmp
      script:
        image: python
        command: [python]
        source: |
          import json
          result = {{inputs.artifacts.result}}
          with open(result, 'r') as outfile:
            lines = outfile.read()
            print(lines)
          print('Execution completed')

这个工作流程有什么问题?

在最后一个模板中,将 {{inputs.artifacts.result}} 替换为 ”/tmp/templates_lst.txt”

inputs.artifacts.NAMEsource 字段中没有意义,所以 Argo 保持原样。 Python 尝试将其解释为代码,这就是您得到异常的原因。

在 Argo 中将输入工件传递给 Python 的正确方法是在模板输入定义中指定工件目的地(您已经完成)。然后在 Python 中,使用该路径中的文件,就像在任何 Python 应用程序中一样。