使用 CWL(通用工作流语言)时将目录挂载到 docker 容器

Tob*_*s G 5 workflow pipeline docker

我试图在使用 CWL 时将一堆非常大的文件放入 docker 容器中。当使用默认的文件输入方法时

工作.yml:

input_file:
  class: File
  path: /home/ubuntu/data/bigfile.zip
Run Code Online (Sandbox Code Playgroud)

CWL 运行程序以某种方式复制文件并卡住。有没有一种简单的方法可以将目录直接安装到 docker 容器中?

任务.cwl:

cwlVersion: cwl:draft-3
class: CommandLineTool
baseCommand: run.sh

hints:
  - class: DockerRequirement
    dockerImageId: name123

inputs:
  - id: input_file
    type: File
    inputBinding:
      position: 1
outputs: []
Run Code Online (Sandbox Code Playgroud)

提前致谢!

Kau*_*ose 0

CWL 用户指南有一个如何执行此操作的示例:https ://www.commonwl.org/user_guide/15-staging/index.html

您可以使用InitialWorkDirRequirement输入文件并将其添加到要在工作目录中暂存的文件列表中,如下所示:

cwlVersion: v1.0
class: CommandLineTool
baseCommand: cat

hints:
  DockerRequirement:
    dockerPull: alpine

inputs:
  in1:
    type: File
    inputBinding:
      position: 1
      valueFrom: $(self.basename)

requirements:
  InitialWorkDirRequirement:
    listing:
      - $(inputs.in1)

outputs:
  out1: stdout
Run Code Online (Sandbox Code Playgroud)

当您运行此程序时,例如使用 CWL 参考运行程序 ( cwltool),您可以看到输入文件直接安装在工作目录中(但安全地以只读模式安装):

[job step-staging.cwl] /private/tmp/docker_tmpIaCJQ8$ docker \
run \
-i \
--volume=/private/tmp/docker_tmpIaCJQ8:/XMOiku:rw \
--volume=/private/tmp/docker_tmpW2RR3v:/tmp:rw \
--volume=/Users/kghose/Work/code/conditional/runif-examples/wf1.cwl:/XMOiku/wf1.cwl:ro \
--workdir=/XMOiku \
--read-only=true \
--log-driver=none \
--user=501:20 \
--rm \
--env=TMPDIR=/tmp \
--env=HOME=/XMOiku \
--cidfile=/private/tmp/docker_tmpdV6afe/20190502114327-207989.cid \
alpine \
cat \
wf1.cwl > /private/tmp/docker_tmpIaCJQ8/f3c708b20abf7fbf7f089060ec071c0956eb0cfd
Run Code Online (Sandbox Code Playgroud)

然而,正如 @TheDudeAbides 所说,CWL 1.0 的行为是挂载文件而不是复制它们。因此,即使您没有暂存它们,它们也会被安装以使它们可供容器使用,只是在不同的目录中。这就是 cwltool、toil 和 SBG 平台的工作原理。