2

我正在使用 GCP 作曲家来运行算法,并且在流结束时我想运行一个任务,该任务将执行多个操作,将文件和文件夹从卷复制和删除到存储桶我正在尝试执行这些复制和删除通过kubernetespodoperator. 我很难找到使用“cmds”运行多个命令的正确方法我也尝试使用“cmds”和“arguments”。这是我KubernetesPodOperator和我尝试过的 cmds 和参数组合:

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,
        )
    ],
)
4

2 回答 2

1

对于您的第一个命令,您需要确保在您的 docker 中您能够访问允许您查找文件的工作目录/data/splitter-output\*.csv

[“gsutil”、“cp”、“/data/splitter-output*.csv”、“gs://my_bucket/data”]

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

在您的第二条语句中,如果您要引用 docker 映像中的路径,请再次使用run来测试它。如果您指的是 google 存储,则必须提供完整路径。

[“gsutil”,“rm”,“-r”,“/输入”]

值得一提的是,ENTRYPOINT一旦容器开始运行,就会运行,如了解 cmd 和入口点如何交互所述。正如评论中提到的,如果您查看它替换 docker image的代码 。它还建议遵循为容器定义命令和参数的指南cmdsENTRYPOINT

于 2022-01-28T14:04:36.707 回答
0

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

Kubernetespodoperator cmds 会覆盖 docker 原来的 ENTRYPOINT 并且 Kubernetespodoperator 参数相当于 docker 的 CMD。

因此,为了从 Kubernetespodoperator 运行多个命令,我使用了以下语法:我将 Kubernetespodoperator cmds 设置为使用 -c 运行 bash:

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"],
)
于 2022-02-07T12:15:54.350 回答