如何在Argo工作流输出完成或出错后执行指定命令?
实现方案
要在输出制品传输完成或出错时执行时间戳命令,推荐以下两种机制,可根据实际需求选择:
机制一:将制品传输与命令逻辑整合到容器脚本中
放弃依赖Argo的outputs.artifacts自动传输,直接在容器的命令脚本里处理S3上传,并通过Shell的trap或条件判断确保无论上传成功/失败都执行时间戳命令。这种方式能直接捕获传输过程的状态,逻辑更可控。
修改后的templateB示例:
- name: templateB container: image: <SOME IMAGE> # 确保镜像包含aws-cli或其他S3传输工具 command: [sh, -c] args: [ "trap 'echo \"Timestamp: $(date)\"' EXIT; echo Hello World; # 替换为你的实际S3上传命令 aws s3 cp /path/to/local/file s3://your-bucket/target/path" ]
trap '命令' EXIT会在脚本无论正常退出还是错误终止时,自动执行指定的时间戳命令。- 如果需要区分成功/失败的时间戳,可调整脚本逻辑:
args: [ "echo Hello World; if aws s3 cp /path/to/local/file s3://your-bucket/target/path; then echo \"Success Timestamp: $(date)\"; else echo \"Failure Timestamp: $(date)\"; fi" ]
机制二:利用Argo工作流的生命周期钩子(适用于必须用outputs.artifacts的场景)
如果坚持使用Argo的outputs.artifacts自动传输,由于制品传输是在容器退出后由Argo控制器执行的,无法在容器内直接捕获传输状态。此时可以通过Argo的工作流终止钩子结合额外模板实现:
- 新增一个用于执行时间戳的模板:
- name: record-timestamp container: image: <SOME IMAGE> command: [sh, -c] args: ["echo \"Artifact transfer lifecycle finished at: $(date)\""]
- 在工作流的
spec中调整onExit配置,原templateB保留outputs.artifacts:
spec: entrypoint: templateA onExit: record-timestamp # 替换原onExit为时间戳模板 templates: - name: templateA <templateA YAML specs here> - name: templateB container: image: <SOME IMAGE> command: [sh, -c] args: ["echo Hello World"] outputs: artifacts: <CODE TO COPY FROM LOCAL TO S3> - name: record-timestamp container: image: <SOME IMAGE> command: [sh, -c] args: ["echo \"Artifact transfer lifecycle finished at: $(date)\""]
这种方式的局限是:无法区分制品传输是成功还是失败,只能在工作流完全结束时触发时间戳命令。
内容的提问来源于stack exchange,提问作者here_to_learn
相关产品推荐
相关产品推荐

