Kubernetespodoperator 如何使用 cmds 或 cmds 和参数 运行 多个命令

Kubernetespodoperator how to use cmds or cmds and arguments to run multiple commands

我正在使用 GCP Composer 运行 一种算法,在流的末尾我想 运行 一项任务,该任务将执行多项操作,从卷中复制和删除文件和文件夹我正在尝试通过 kubernetespodoperator 执行这些复制和删除操作的存储桶。我很难找到 运行 使用“cmds”的几个命令的正确方法我也尝试过将“cmds”与“arguments”一起使用。 这是我的 KubernetesPodOperator 以及我尝试的命令和参数组合:

post_algo_run = kubernetes_pod_operator.KubernetesPodOperator(
    task_id="multi-coher-post-operations",
    name="multi-coher-post-operations",
    namespace="default",
    image="google/cloud-sdk:alpine",
    
    ### doesn't work ###
    cmds=["gsutil", "cp", "/data/splitter-output\*.csv",  "gs://my_bucket/data" , "&" , "gsutil", "rm", "-r", "/input"], 
    #Error:
        #[2022-01-27 09:31:38,407] {pod_manager.py:197} INFO - CommandException: Destination URL must name a directory, bucket, or bucket
        #[2022-01-27 09:31:38,408] {pod_manager.py:197} INFO - subdirectory for the multiple source form of the cp command.
    ####################

    ### doesn't work ###
    # cmds=["gsutil", "cp", "/data/splitter-output\*.csv",  "gs://my_bucket/data ;","gsutil", "rm", "-r", "/input"],
        # [2022-01-27 09:34:06,865] {pod_manager.py:197} INFO - CommandException: Destination URL must name a directory, bucket, or bucket
        # [2022-01-27 09:34:06,866] {pod_manager.py:197} INFO - subdirectory for the multiple source form of the cp command.
    ####################

    ### only preform the first command - only copying ###
    # cmds=["bash", "-cx"],
    # arguments=["gsutil cp /data/splitter-output\*.csv gs://my_bucket/data","gsutil rm -r /input"],                                    
        # [2022-01-27 09:36:09,164] {pod_manager.py:197} INFO - + gsutil cp '/data/splitter-output*.csv' gs://my_bucket/data
        # [2022-01-27 09:36:11,200] {pod_manager.py:197} INFO - Copying file:///data/splitter-output\Coherence Results-26-Jan-2022-1025Part1.csv [Content-Type=text/csv]...
        # [2022-01-27 09:36:11,300] {pod_manager.py:197} INFO - / [0 files][    0.0 B/ 93.0 KiB]                                                
        # / [1 files][ 93.0 KiB/ 93.0 KiB]
        # [2022-01-27 09:36:11,302] {pod_manager.py:197} INFO - Operation completed over 1 objects/93.0 KiB.
        # [20   22-01-27 09:36:12,317] {kubernetes_pod.py:459} INFO - Deleting pod: multi-coher-post-operations.d66b4c91c9024bd289171c4d3ce35fdd
    ####################


    volumes=[
        Volume(
            name="nfs-pvc",
            configs={
                "persistentVolumeClaim": {"claimName": "nfs-pvc"}
            },
        )
    ],
    volume_mounts=[
        VolumeMount(
            name="nfs-pvc",
            mount_path="/data/",
            sub_path=None,
            read_only=False,
        )
    ],
)

对于您的第一个命令,您需要确保在您的 docker 中您能够到达允许您找到文件 /data/splitter-output\*.csv

的工作目录

["gsutil", "cp", "/data/splitter-output*.csv", "gs://my_bucket/data"]

您可以使用 docker RUN 在 docker 图像上测试您的命令,以便验证您是否正确提供了命令。

在您的第二个陈述中,如果您再次引用 docker 图像中的路径,请使用 run 对其进行测试。如果您指的是 google 存储,则必须提供完整路径。

["gsutil", "rm", "-r", "/input"]

值得一提的是,ENTRYPOINT 将 运行 一旦容器按照 understand how cmd and entrypoint interact. As mention in the comment, if you look at the code cmds 中的描述启动 运行ning 它将取代 docker图片 ENTRYPOINT。 它还建议遵循 Define a Command and Arguments for a Container

的准则

我找到了 运行 宁多个命令的技巧。 首先,我找到了 Kubernetespodoperator cmds 和 Docker 的 ENTRYPOINT 和 CMD 的参数属性之间的关系。

Kubernetespodoperator cmd 覆盖 docker 原来的 ENTRYPOINT 和 Kubernetespodoperator 参数等同于 docker 的 CMD。

因此,为了 运行 来自 Kubernetespodoperator 的多个命令,我使用了以下语法: 我已经将 Kubernetespodoperator cmds 设置为 运行 bash 和 -c:

cmds=["/bin/bash", "-c"],

并且我已将 Kubernetespodoperator 参数设置为 运行 两个由 &:

分隔的 echo 命令
arguments=["echo hello && echo goodbye"],

所以我的 Kubernetespodoperator 看起来像这样:

stajoverflow_test = KubernetesPodOperator(
    task_id="stajoverflow_test",
    name="stajoverflow_test",
    namespace="default",
    image="google/cloud-sdk:alpine",
    cmds=["/bin/bash", "-c"],
    arguments=["echo hello && echo goodbye"],
)