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

时间:2017-01-05 15:45:05

标签: docker workflow pipeline

我正在尝试使用CWL将一堆非常大的文件放入docker容器中。通过

使用文件输入的默认方法时

job.yml:

input_file:
  class: File
  path: /home/ubuntu/data/bigfile.zip

CWL跑步者以某种方式复制文件并被卡住。是否有一种简单的方法可以直接将目录安装到docker容器中?

task.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: []

提前致谢!

1 个答案:

答案 0 :(得分: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

运行此命令时,例如使用CWL参考运行程序(cwltool),您会看到输入文件直接安装在工作目录中(但安全地处于ReadOnly模式):

[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

但是,正如@TheDudeAbides所说,CWL 1.0的行为是挂载文件而不是复制文件。因此,即使您没有暂存它们,也将挂载它们以使它们可用于容器,只是在另一个目录中。这就是cwltool,toil和SBG平台的工作方式。