ERROR I'm sorry, I couldn't load this CWL file, try again with --debug for more information. The error was: Union item must be a valid Avro schema: Type property "['null', {'type': 'array', 'items': ['InlineJavascriptRequirement', 'SchemaDefRequirement', 'LoadListingRequirement', {'type': 'record', 'name': 'DockerRequirement', 'extends': 'https://w3id.org/cwl/cwl#ProcessRequirement', 'doc': "Indicates that a workflow component should be run in a\n[Docker](http://docker.com) or Docker-compatible (such as\n[Singularity](https://www.sylabs.io/) and [udocker](https://github.com/indigo-dc/udocker)) container environment and\nspecifies how to fetch or build the image.\n\nIf a CommandLineTool lists `DockerRequirement` under\n`hints` (or `requirements`), it may (or must) be run in the specified Docker\ncontainer.\n\nThe platform must first acquire or install the correct Docker image as\nspecified by `dockerPull`, `dockerImport`, `dockerLoad` or `dockerFile`.\n\nThe platform must execute the tool in the container using `docker run` with\nthe appropriate Docker image and tool command line.\n\nThe workflow platform may provide input files and the designated output\ndirectory through the use of volume bind mounts. The platform should rewrite\nfile paths in the input object to correspond to the Docker bind mounted\nlocations. That is, the platform should rewrite values in the parameter context\nsuch as `runtime.outdir`, `runtime.tmpdir` and others to be valid paths\nwithin the container. The platform must ensure that `runtime.outdir` and\n`runtime.tmpdir` are distinct directories.\n\nWhen running a tool contained in Docker, the workflow platform must not\nassume anything about the contents of the Docker container, such as the\npresence or absence of specific software, except to assume that the\ngenerated command line represents a valid command within the runtime\nenvironment of the container.\n\nA container image may specify an\n[ENTRYPOINT](https://docs.docker.com/engine/reference/builder/#entrypoint)\nand/or\n[CMD](https://docs.docker.com/engine/reference/builder/#cmd).\nCommand line arguments will be appended after all elements of\nENTRYPOINT, and will override all elements specified using CMD (in\nother words, CMD is only used when the CommandLineTool definition\nproduces an empty command line).\n\nUse of implicit ENTRYPOINT or CMD are discouraged due to reproducibility\nconcerns of the implicit hidden execution point (For further discussion, see\n[https://doi.org/10.12688/f1000research.15140.1](https://doi.org/10.12688/f1000research.15140.1)). Portable\nCommandLineTool wrappers in which use of a container is optional must not rely on ENTRYPOINT or CMD.\nCommandLineTools which do rely on ENTRYPOINT or CMD must list `DockerRequirement` in the\n`requirements` section.\n\n## Interaction with other requirements\n\nIf [EnvVarRequirement](#EnvVarRequirement) is specified alongside a\nDockerRequirement, the environment variables must be provided to Docker\nusing `--env` or `--env-file` and interact with the container's preexisting\nenvironment as defined by Docker.\n", 'fields': [{'name': 'class', 'type': 'string', 'doc': "Always 'DockerRequirement'", 'jsonldPredicate': {'_id': '@type', '_type': '@vocab'}}, {'name': 'dockerPull', 'type': ['null', 'string'], 'doc': 'Specify a Docker image to retrieve using `docker pull`.'}, {'name': 'dockerLoad', 'type': ['null', 'string'], 'doc': 'Specify a HTTP URL from which to download a Docker image using `docker load`.'}, {'name': 'dockerFile', 'type': ['null', 'string'], 'doc': 'Supply the contents of a Dockerfile which will be built using `docker build`.'}, {'name': 'dockerImport', 'type': ['null', 'string'], 'doc': 'Provide HTTP URL to download and gunzip a Docker images using `docker import.'}, {'name': 'dockerImageId', 'type': ['null', 'string'], 'doc': 'The image id that will be used for `docker run`. May be a\nhuman-readable image name or the image identifier hash. May be skipped\nif `dockerPull` is specified, in which case the `dockerPull` image id\nmust be used.\n'}, {'name': 'dockerOutputDirectory', 'type': ['null', 'string'], 'doc': 'Set the designated output directory to a specific location inside the\nDocker container.\n'}]}, {'type': 'record', 'name': 'SoftwareRequirement', 'extends': 'https://w3id.org/cwl/cwl#ProcessRequirement', 'doc': 'A list of software packages that should be configured in the environment of\nthe defined process.\n', 'fields': [{'name': 'class', 'type': 'string', 'doc': "Always 'SoftwareRequirement'", 'jsonldPredicate': {'_id': '@type', '_type': '@vocab'}}, {'name': 'packages', 'type': {'type': 'array', 'items': {'name': 'SoftwarePackage', 'type': 'record', 'fields': [{'name': 'package', 'type': 'string', 'doc': 'The name of the software to be made available. If the name is\ncommon, inconsistent, or otherwise ambiguous it should be combined with\none or more identifiers in the `specs` field.\n'}, {'name': 'version', 'type': ['null', {'type': 'array', 'items': 'string', 'name': ''}], 'doc': 'The (optional) versions of the software that are known to be\ncompatible.\n'}, {'name': 'specs', 'type': ['null', {'type': 'array', 'items': 'string', 'name': ''}], 'jsonldPredicate': {'_type': '@id', 'noLinkCheck': True}, 'doc': 'One or more [IRI](https://en.wikipedia.org/wiki/Internationalized_Resource_Identifier)s\nidentifying resources for installing or enabling the software named in\nthe `package` field. Implementations may provide resolvers which map\nthese software identifer IRIs to some configuration action; or they can\nuse only the name from the `package` field on a best effort basis.\n\nFor example, the IRI https://packages.debian.org/bowtie could\nbe resolved with `apt-get install bowtie`. The IRI\nhttps://anaconda.org/bioconda/bowtie could be resolved with `conda\ninstall -c bioconda bowtie`.\n\nIRIs can also be system independent and used to map to a specific\nsoftware installation or selection mechanism.\nUsing [RRID](https://www.identifiers.org/rrid/) as an example:\nhttps://identifiers.org/rrid/RRID:SCR_005476\ncould be fulfilled using the above mentioned Debian or bioconda\npackage, a local installation managed by [Environement Modules](http://modules.sourceforge.net/),\nor any other mechanism the platform chooses. IRIs can also be from\nidentifer sources that are discipline specific yet still system\nindependent. As an example, the equivalent [ELIXIR Tools and Data\nService Registry](https://bio.tools) IRI to the previous RRID example is\nhttps://bio.tools/tool/bowtie2/version/2.2.8.\nIf supported by a given registry, implementations are encouraged to\nquery these system independent sofware identifier IRIs directly for\nlinks to packaging systems.\n\nA site specific IRI can be listed as well. For example, an academic\ncomputing cluster using Environement Modules could list the IRI\n`https://hpc.example.edu/modules/bowtie-tbb/1.22` to indicate that\n`module load bowtie-tbb/1.1.2` should be executed to make available\n`bowtie` version 1.1.2 compiled with the TBB library prior to running\nthe accompanying Workflow or CommandLineTool. Note that the example IRI\nis specific to a particular institution and computing environment as\nthe Environment Modules system does not have a common namespace or\nstandardized naming convention.\n\nThis last example is the least portable and should only be used if\nmechanisms based off of the `package` field or more generic IRIs are\nunavailable or unsuitable. While harmless to other sites, site specific\nsoftware IRIs should be left out of shared CWL descriptions to avoid\nclutter.\n'}]}, 'name': ''}, 'doc': 'The list of software to be configured.', 'jsonldPredicate': {'mapSubject': 'package', 'mapPredicate': 'specs'}}]}, {'name': 'InitialWorkDirRequirement', 'type': 'record', 'extends': 'https://w3id.org/cwl/cwl#ProcessRequirement', 'doc': 'Define a list of files and subdirectories that must be created by the workflow platform in the designated output directory prior to executing the command line tool.', 'fields': [{'name': 'class', 'type': 'string', 'doc': 'InitialWorkDirRequirement', 'jsonldPredicate': {'_id': '@type', '_type': '@vocab'}}, {'name': 'listing', 'type': [{'type': 'array', 'items': ['null', 'File', {'type': 'array', 'items': ['File', 'Directory'], 'name': ''}, 'Directory', {'name': 'Dirent', 'type': 'record', 'doc': 'Define a file or subdirectory that must be placed in the designated output\ndirectory prior to executing the command line tool. May be the result of\nexecuting an expression, such as building a configuration file from a\ntemplate.\n', 'fields': [{'name': 'entryname', 'type': ['null', 'string', 'Expression'], 'jsonldPredicate': {'_id': 'https://w3id.org/cwl/cwl#entryname'}, 'doc': 'The name of the file or subdirectory to create in the output directory.\nIf `entry` is a File or Directory, the `entryname` field overrides the value\nof `basename` of the File or Directory object. Optional.\n'}, {'name': 'entry', 'type': ['string', 'Expression'], 'jsonldPredicate': {'_id': 'https://w3id.org/cwl/cwl#entry'}, 'doc': 'If the value is a string literal or an expression which evaluates to a\nstring, a new file must be created with the string as the file contents.\n\nIf the value is an expression that evaluates to a `File` object, this\nindicates the referenced file should be added to the designated output\ndirectory prior to executing the tool.\n\nIf the value is an expression that evaluates to a `Dirent` object, this\nindicates that the File or Directory in `entry` should be added to the\ndesignated output directory with the name in `entryname`.\n\nIf `writable` is false, the file may be made available using a bind\nmount or file system link to avoid unnecessary copying of the input\nfile.\n'}, {'name': 'writable', 'type': ['null', 'boolean'], 'default': False, 'doc': 'If true, the file or directory must be writable by the tool. Changes\nto the file or directory must be isolated and not visible by any other\nCommandLineTool process. This may be implemented by making a copy of\nthe original file or directory. Default false (files and directories\nread-only by default).\n\nA directory marked as `writable: true` implies that all files and\nsubdirectories are recursively writable as well.\n'}]}, 'Expression'], 'name': ''}, 'Expression'], 'jsonldPredicate': {'_id': 'https://w3id.org/cwl/cwl#listing'}, 'doc': 'The list of files or subdirectories that must be placed in the\ndesignated output directory prior to executing the command line tool.\n\nMay be an expression. If so, the expression return value must validate as\n`{type: array, items: ["null", File, File[], Directory, Directory[], Dirent]}`.\n\nFiles or Directories which are listed in the input parameters and\nappear in the `InitialWorkDirRequirement` listing must have their\n`path` set to their staged location in the designated output directory.\nIf the same File or Directory appears more than once in the\n`InitialWorkDirRequirement` listing, the implementation must choose\nexactly one value for `path`; how this value is chosen is undefined.\n'}]}, {'name': 'EnvVarRequirement', 'type': 'record', 'extends': 'https://w3id.org/cwl/cwl#ProcessRequirement', 'doc': 'Define a list of environment variables which will be set in the\nexecution environment of the tool. See `EnvironmentDef` for details.\n', 'fields': [{'name': 'class', 'type': 'string', 'doc': "Always 'EnvVarRequirement'", 'jsonldPredicate': {'_id': '@type', '_type': '@vocab'}}, {'name': 'envDef', 'type': {'type': 'array', 'items': 'EnvironmentDef', 'name': ''}, 'doc': 'The list of environment variables.', 'jsonldPredicate': {'mapSubject': 'envName', 'mapPredicate': 'envValue'}}]}, {'type': 'record', 'name': 'ShellCommandRequirement', 'extends': 'https://w3id.org/cwl/cwl#ProcessRequirement', 'doc': 'Modify the behavior of CommandLineTool to generate a single string\ncontaining a shell command line. Each item in the argument list must be\njoined into a string separated by single spaces and quoted to prevent\nintepretation by the shell, unless `CommandLineBinding` for that argument\ncontains `shellQuote: false`. If `shellQuote: false` is specified, the\nargument is joined into the command string without quoting, which allows\nthe use of shell metacharacters such as `|` for pipes.\n', 'fields': [{'name': 'class', 'type': 'string', 'doc': "Always 'ShellCommandRequirement'", 'jsonldPredicate': {'_id': '@type', '_type': '@vocab'}}]}, {'type': 'record', 'name': 'ResourceRequirement', 'extends': 'https://w3id.org/cwl/cwl#ProcessRequirement', 'doc': 'Specify basic hardware resource requirements.\n\n"min" is the minimum amount of a resource that must be reserved to schedule\na job. If "min" cannot be satisfied, the job should not be run.\n\n"max" is the maximum amount of a resource that the job shall be permitted\nto use. If a node has sufficient resources, multiple jobs may be scheduled\non a single node provided each job\'s "max" resource requirements are\nmet. If a job attempts to exceed its "max" resource allocation, an\nimplementation may deny additional resources, which may result in job\nfailure.\n\nIf "min" is specified but "max" is not, then "max" == "min"\nIf "max" is specified by "min" is not, then "min" == "max".\n\nIt is an error if max < min.\n\nIt is an error if the value of any of these fields is negative.\n\nIf neither "min" nor "max" is specified for a resource, use the default values below.\n', 'fields': [{'name': 'class', 'type': 'string', 'doc': "Always 'ResourceRequirement'", 'jsonldPredicate': {'_id': '@type', '_type': '@vocab'}}, {'name': 'coresMin', 'type': ['null', 'long', 'Expression'], 'doc': 'Minimum reserved number of CPU cores (default is 1)'}, {'name': 'coresMax', 'type': ['null', 'int', 'Expression'], 'doc': 'Maximum reserved number of CPU cores'}, {'name': 'ramMin', 'type': ['null', 'long', 'Expression'], 'doc': 'Minimum reserved RAM in mebibytes (2**20) (default is 256)'}, {'name': 'ramMax', 'type': ['null', 'long', 'Expression'], 'doc': 'Maximum reserved RAM in mebibytes (2**20)'}, {'name': 'tmpdirMin', 'type': ['null', 'long', 'Expression'], 'doc': 'Minimum reserved filesystem based storage for the designated temporary directory, in mebibytes (2**20) (default is 1024)'}, {'name': 'tmpdirMax', 'type': ['null', 'long', 'Expression'], 'doc': 'Maximum reserved filesystem based storage for the designated temporary directory, in mebibytes (2**20)'}, {'name': 'outdirMin', 'type': ['null', 'long', 'Expression'], 'doc': 'Minimum reserved filesystem based storage for the designated output directory, in mebibytes (2**20) (default is 1024)'}, {'name': 'outdirMax', 'type': ['null', 'long', 'Expression'], 'doc': 'Maximum reserved filesystem based storage for the designated output directory, in mebibytes (2**20)'}]}, {'type': 'record', 'name': 'WorkReuse', 'extends': 'https://w3id.org/cwl/cwl#ProcessRequirement', 'doc': 'For implementations that support reusing output from past work (on\nthe assumption that same code and same input produce same\nresults), control whether to enable or disable the reuse behavior\nfor a particular tool or step (to accomodate situations where that\nassumption is incorrect). A reused step is not executed but\ninstead returns the same output as the original execution.\n\nIf `enableReuse` is not specified, correct tools should assume it\nis enabled by default.\n', 'fields': [{'name': 'class', 'type': 'string', 'doc': "Always 'WorkReuse'", 'jsonldPredicate': {'_id': '@type', '_type': '@vocab'}}, {'name': 'enableReuse', 'type': ['boolean', 'Expression'], 'default': True}]}, {'type': 'record', 'name': 'NetworkAccess', 'extends': 'https://w3id.org/cwl/cwl#ProcessRequirement', 'doc': 'Indicate whether a process requires outgoing IPv4/IPv6 network\naccess. Choice of IPv4 or IPv6 is implementation and site\nspecific, correct tools must support both.\n\nIf `networkAccess` is false or not specified, tools must not\nassume network access, except for localhost (the loopback device).\n\nIf `networkAccess` is true, the tool must be able to make outgoing\nconnections to network resources. Resources may be on a private\nsubnet or the public Internet. However, implementations and sites\nmay apply their own security policies to restrict what is\naccessible by the tool.\n\nEnabling network access does not imply a publically routable IP\naddress or the ability to accept inbound connections.\n', 'fields': [{'name': 'class', 'type': 'string', 'doc': "Always 'NetworkAccess'", 'jsonldPredicate': {'_id': '@type', '_type': '@vocab'}}, {'name': 'networkAccess', 'type': ['boolean', 'Expression']}]}, {'name': 'InplaceUpdateRequirement', 'type': 'record', 'extends': 'https://w3id.org/cwl/cwl#ProcessRequirement', 'doc': '\nIf `inplaceUpdate` is true, then an implementation supporting this\nfeature may permit tools to directly update files with `writable:\ntrue` in InitialWorkDirRequirement. That is, as an optimization,\nfiles may be destructively modified in place as opposed to copied\nand updated.\n\nAn implementation must ensure that only one workflow step may\naccess a writable file at a time. It is an error if a file which\nis writable by one workflow step file is accessed (for reading or\nwriting) by any other workflow step running independently.\nHowever, a file which has been updated in a previous completed\nstep may be used as input to multiple steps, provided it is\nread-only in every step.\n\nWorkflow steps which modify a file must produce the modified file\nas output. Downstream steps which futher process the file must\nuse the output of previous steps, and not refer to a common input\n(this is necessary for both ordering and correctness).\n\nWorkflow authors should provide this in the `hints` section. The\nintent of this feature is that workflows produce the same results\nwhether or not InplaceUpdateRequirement is supported by the\nimplementation, and this feature is primarily available as an\noptimization for particular environments.\n\nUsers and implementers should be aware that workflows that\ndestructively modify inputs may not be repeatable or reproducible.\nIn particular, enabling this feature implies that WorkReuse should\nnot be enabled.\n', 'fields': [{'type': 'string', 'doc': "Always 'InplaceUpdateRequirement'", 'jsonldPredicate': {'_id': '@type', '_type': '@vocab'}, 'name': 'class'}, {'type': 'boolean', 'name': 'inplaceUpdate'}]}, {'type': 'record', 'name': 'ToolTimeLimit', 'extends': 'https://w3id.org/cwl/cwl#ProcessRequirement', 'doc': 'Set an upper limit on the execution time of a CommandLineTool.\nA CommandLineTool whose execution duration exceeds the time\nlimit may be preemptively terminated and considered failed.\nMay also be used by batch systems to make scheduling decisions.\nThe execution duration excludes external operations, such as\nstaging of files, pulling a docker image etc, and only counts\nwall-time for the execution of the command line itself.\n', 'fields': [{'name': 'class', 'type': 'string', 'doc': "Always 'ToolTimeLimit'", 'jsonldPredicate': {'_id': '@type', '_type': '@vocab'}}, {'name': 'timelimit', 'type': ['long', 'Expression'], 'doc': 'The time limit, in seconds. A time limit of zero means no\ntime limit. Negative time limits are an error.\n'}]}, {'type': 'record', 'name': 'SubworkflowFeatureRequirement', 'extends': 'https://w3id.org/cwl/cwl#ProcessRequirement', 'doc': 'Indicates that the workflow platform must support nested workflows in\nthe `run` field of [WorkflowStep](#WorkflowStep).\n', 'fields': [{'name': 'class', 'type': 'string', 'doc': "Always 'SubworkflowFeatureRequirement'", 'jsonldPredicate': {'_id': '@type', '_type': '@vocab'}}]}, {'name': 'ScatterFeatureRequirement', 'type': 'record', 'extends': 'https://w3id.org/cwl/cwl#ProcessRequirement', 'doc': 'Indicates that the workflow platform must support the `scatter` and\n`scatterMethod` fields of [WorkflowStep](#WorkflowStep).\n', 'fields': [{'name': 'class', 'type': 'string', 'doc': "Always 'ScatterFeatureRequirement'", 'jsonldPredicate': {'_id': '@type', '_type': '@vocab'}}]}, {'name': 'MultipleInputFeatureRequirement', 'type': 'record', 'extends': 'https://w3id.org/cwl/cwl#ProcessRequirement', 'doc': 'Indicates that the workflow platform must support multiple inbound data links\nlisted in the `source` field of [WorkflowStepInput](#WorkflowStepInput).\n', 'fields': [{'name': 'class', 'type': 'string', 'doc': "Always 'MultipleInputFeatureRequirement'", 'jsonldPredicate': {'_id': '@type', '_type': '@vocab'}}]}, {'type': 'record', 'name': 'StepInputExpressionRequirement', 'extends': 'https://w3id.org/cwl/cwl#ProcessRequirement', 'doc': 'Indicate that the workflow platform must support the `valueFrom` field\nof [WorkflowStepInput](#WorkflowStepInput).\n', 'fields': [{'name': 'class', 'type': 'string', 'doc': "Always 'StepInputExpressionRequirement'", 'jsonldPredicate': {'_id': '@type', '_type': '@vocab'}}]}, {'name': 'http://commonwl.org/cwltool#Secrets', 'type': 'record', 'inVocab': False, 'extends': 'https://w3id.org/cwl/cwl#ProcessRequirement', 'fields': [{'type': 'string', 'doc': "Always 'Secrets'", 'jsonldPredicate': {'_id': '@type', '_type': '@vocab'}, 'name': 'class'}, {'type': {'type': 'array', 'items': 'string', 'name': ''}, 'doc': 'List one or more input parameters that are sensitive (such as passwords)\nwhich will be deliberately obscured from logging.\n', 'jsonldPredicate': {'_type': '@id', 'refScope': 0}, 'name': 'secrets'}]}, {'name': 'http://commonwl.org/cwltool#MPIRequirement', 'type': 'record', 'inVocab': False, 'extends': 'https://w3id.org/cwl/cwl#ProcessRequirement', 'doc': 'Indicates that a process requires an MPI runtime.\n', 'fields': [{'name': 'class', 'type': 'string', 'doc': "Always 'MPIRequirement'", 'jsonldPredicate': {'_id': '@type', '_type': '@vocab'}}, {'name': 'processes', 'type': ['int', 'string'], 'doc': 'The number of MPI processes to start. If you give a string,\nthis will be evaluated as a CWL Expression and it must\nevaluate to an integer.\n'}]}, {'name': 'http://commonwl.org/cwltool#StepNameHint', 'type': 'record', 'inVocab': False, 'extends': 'https://w3id.org/cwl/cwl#ProcessRequirement', 'doc': 'Provide a hint for naming the runtime workflow step in logs or user interface.\n', 'fields': [{'name': 'class', 'type': 'string', 'doc': "Always 'StepNameHint'", 'jsonldPredicate': {'_id': '@type', '_type': '@vocab'}}, {'name': 'stepname', 'type': ['string', 'Expression'], 'doc': 'A string or expression returning a string with the preferred name for the step.\nIf it is an expression, it is evaluated after the input object has been completely determined.\n'}]}], 'name': ''}]" not a valid Avro schema: Union item must be a valid Avro schema: Items schema (['InlineJavascriptRequirement', 'SchemaDefRequirement', 'LoadListingRequirement', {'type': 'record', 'name': 'DockerRequirement', 'extends': 'https://w3id.org/cwl/cwl#ProcessRequirement', 'doc': "Indicates that a workflow component should be run in a\n[Docker](http://docker.com) or Docker-compatible (such as\n[Singularity](https://www.sylabs.io/) and [udocker](https://github.com/indigo-dc/udocker)) container environment and\nspecifies how to fetch or build the image.\n\nIf a CommandLineTool lists `DockerRequirement` under\n`hints` (or `requirements`), it may (or must) be run in the specified Docker\ncontainer.\n\nThe platform must first acquire or install the correct Docker image as\nspecified by `dockerPull`, `dockerImport`, `dockerLoad` or `dockerFile`.\n\nThe platform must execute the tool in the container using `docker run` with\nthe appropriate Docker image and tool command line.\n\nThe workflow platform may provide input files and the designated output\ndirectory through the use of volume bind mounts. The platform should rewrite\nfile paths in the input object to correspond to the Docker bind mounted\nlocations. That is, the platform should rewrite values in the parameter context\nsuch as `runtime.outdir`, `runtime.tmpdir` and others to be valid paths\nwithin the container. The platform must ensure that `runtime.outdir` and\n`runtime.tmpdir` are distinct directories.\n\nWhen running a tool contained in Docker, the workflow platform must not\nassume anything about the contents of the Docker container, such as the\npresence or absence of specific software, except to assume that the\ngenerated command line represents a valid command within the runtime\nenvironment of the container.\n\nA container image may specify an\n[ENTRYPOINT](https://docs.docker.com/engine/reference/builder/#entrypoint)\nand/or\n[CMD](https://docs.docker.com/engine/reference/builder/#cmd).\nCommand line arguments will be appended after all elements of\nENTRYPOINT, and will override all elements specified using CMD (in\nother words, CMD is only used when the CommandLineTool definition\nproduces an empty command line).\n\nUse of implicit ENTRYPOINT or CMD are discouraged due to reproducibility\nconcerns of the implicit hidden execution point (For further discussion, see\n[https://doi.org/10.12688/f1000research.15140.1](https://doi.org/10.12688/f1000research.15140.1)). Portable\nCommandLineTool wrappers in which use of a container is optional must not rely on ENTRYPOINT or CMD.\nCommandLineTools which do rely on ENTRYPOINT or CMD must list `DockerRequirement` in the\n`requirements` section.\n\n## Interaction with other requirements\n\nIf [EnvVarRequirement](#EnvVarRequirement) is specified alongside a\nDockerRequirement, the environment variables must be provided to Docker\nusing `--env` or `--env-file` and interact with the container's preexisting\nenvironment as defined by Docker.\n", 'fields': [{'name': 'class', 'type': 'string', 'doc': "Always 'DockerRequirement'", 'jsonldPredicate': {'_id': '@type', '_type': '@vocab'}}, {'name': 'dockerPull', 'type': ['null', 'string'], 'doc': 'Specify a Docker image to retrieve using `docker pull`.'}, {'name': 'dockerLoad', 'type': ['null', 'string'], 'doc': 'Specify a HTTP URL from which to download a Docker image using `docker load`.'}, {'name': 'dockerFile', 'type': ['null', 'string'], 'doc': 'Supply the contents of a Dockerfile which will be built using `docker build`.'}, {'name': 'dockerImport', 'type': ['null', 'string'], 'doc': 'Provide HTTP URL to download and gunzip a Docker images using `docker import.'}, {'name': 'dockerImageId', 'type': ['null', 'string'], 'doc': 'The image id that will be used for `docker run`. May be a\nhuman-readable image name or the image identifier hash. May be skipped\nif `dockerPull` is specified, in which case the `dockerPull` image id\nmust be used.\n'}, {'name': 'dockerOutputDirectory', 'type': ['null', 'string'], 'doc': 'Set the designated output directory to a specific location inside the\nDocker container.\n'}]}, {'type': 'record', 'name': 'SoftwareRequirement', 'extends': 'https://w3id.org/cwl/cwl#ProcessRequirement', 'doc': 'A list of software packages that should be configured in the environment of\nthe defined process.\n', 'fields': [{'name': 'class', 'type': 'string', 'doc': "Always 'SoftwareRequirement'", 'jsonldPredicate': {'_id': '@type', '_type': '@vocab'}}, {'name': 'packages', 'type': {'type': 'array', 'items': {'name': 'SoftwarePackage', 'type': 'record', 'fields': [{'name': 'package', 'type': 'string', 'doc': 'The name of the software to be made available. If the name is\ncommon, inconsistent, or otherwise ambiguous it should be combined with\none or more identifiers in the `specs` field.\n'}, {'name': 'version', 'type': ['null', {'type': 'array', 'items': 'string', 'name': ''}], 'doc': 'The (optional) versions of the software that are known to be\ncompatible.\n'}, {'name': 'specs', 'type': ['null', {'type': 'array', 'items': 'string', 'name': ''}], 'jsonldPredicate': {'_type': '@id', 'noLinkCheck': True}, 'doc': 'One or more [IRI](https://en.wikipedia.org/wiki/Internationalized_Resource_Identifier)s\nidentifying resources for installing or enabling the software named in\nthe `package` field. Implementations may provide resolvers which map\nthese software identifer IRIs to some configuration action; or they can\nuse only the name from the `package` field on a best effort basis.\n\nFor example, the IRI https://packages.debian.org/bowtie could\nbe resolved with `apt-get install bowtie`. The IRI\nhttps://anaconda.org/bioconda/bowtie could be resolved with `conda\ninstall -c bioconda bowtie`.\n\nIRIs can also be system independent and used to map to a specific\nsoftware installation or selection mechanism.\nUsing [RRID](https://www.identifiers.org/rrid/) as an example:\nhttps://identifiers.org/rrid/RRID:SCR_005476\ncould be fulfilled using the above mentioned Debian or bioconda\npackage, a local installation managed by [Environement Modules](http://modules.sourceforge.net/),\nor any other mechanism the platform chooses. IRIs can also be from\nidentifer sources that are discipline specific yet still system\nindependent. As an example, the equivalent [ELIXIR Tools and Data\nService Registry](https://bio.tools) IRI to the previous RRID example is\nhttps://bio.tools/tool/bowtie2/version/2.2.8.\nIf supported by a given registry, implementations are encouraged to\nquery these system independent sofware identifier IRIs directly for\nlinks to packaging systems.\n\nA site specific IRI can be listed as well. For example, an academic\ncomputing cluster using Environement Modules could list the IRI\n`https://hpc.example.edu/modules/bowtie-tbb/1.22` to indicate that\n`module load bowtie-tbb/1.1.2` should be executed to make available\n`bowtie` version 1.1.2 compiled with the TBB library prior to running\nthe accompanying Workflow or CommandLineTool. Note that the example IRI\nis specific to a particular institution and computing environment as\nthe Environment Modules system does not have a common namespace or\nstandardized naming convention.\n\nThis last example is the least portable and should only be used if\nmechanisms based off of the `package` field or more generic IRIs are\nunavailable or unsuitable. While harmless to other sites, site specific\nsoftware IRIs should be left out of shared CWL descriptions to avoid\nclutter.\n'}]}, 'name': ''}, 'doc': 'The list of software to be configured.', 'jsonldPredicate': {'mapSubject': 'package', 'mapPredicate': 'specs'}}]}, {'name': 'InitialWorkDirRequirement', 'type': 'record', 'extends': 'https://w3id.org/cwl/cwl#ProcessRequirement', 'doc': 'Define a list of files and subdirectories that must be created by the workflow platform in the designated output directory prior to executing the command line tool.', 'fields': [{'name': 'class', 'type': 'string', 'doc': 'InitialWorkDirRequirement', 'jsonldPredicate': {'_id': '@type', '_type': '@vocab'}}, {'name': 'listing', 'type': [{'type': 'array', 'items': ['null', 'File', {'type': 'array', 'items': ['File', 'Directory'], 'name': ''}, 'Directory', {'name': 'Dirent', 'type': 'record', 'doc': 'Define a file or subdirectory that must be placed in the designated output\ndirectory prior to executing the command line tool. May be the result of\nexecuting an expression, such as building a configuration file from a\ntemplate.\n', 'fields': [{'name': 'entryname', 'type': ['null', 'string', 'Expression'], 'jsonldPredicate': {'_id': 'https://w3id.org/cwl/cwl#entryname'}, 'doc': 'The name of the file or subdirectory to create in the output directory.\nIf `entry` is a File or Directory, the `entryname` field overrides the value\nof `basename` of the File or Directory object. Optional.\n'}, {'name': 'entry', 'type': ['string', 'Expression'], 'jsonldPredicate': {'_id': 'https://w3id.org/cwl/cwl#entry'}, 'doc': 'If the value is a string literal or an expression which evaluates to a\nstring, a new file must be created with the string as the file contents.\n\nIf the value is an expression that evaluates to a `File` object, this\nindicates the referenced file should be added to the designated output\ndirectory prior to executing the tool.\n\nIf the value is an expression that evaluates to a `Dirent` object, this\nindicates that the File or Directory in `entry` should be added to the\ndesignated output directory with the name in `entryname`.\n\nIf `writable` is false, the file may be made available using a bind\nmount or file system link to avoid unnecessary copying of the input\nfile.\n'}, {'name': 'writable', 'type': ['null', 'boolean'], 'default': False, 'doc': 'If true, the file or directory must be writable by the tool. Changes\nto the file or directory must be isolated and not visible by any other\nCommandLineTool process. This may be implemented by making a copy of\nthe original file or directory. Default false (files and directories\nread-only by default).\n\nA directory marked as `writable: true` implies that all files and\nsubdirectories are recursively writable as well.\n'}]}, 'Expression'], 'name': ''}, 'Expression'], 'jsonldPredicate': {'_id': 'https://w3id.org/cwl/cwl#listing'}, 'doc': 'The list of files or subdirectories that must be placed in the\ndesignated output directory prior to executing the command line tool.\n\nMay be an expression. If so, the expression return value must validate as\n`{type: array, items: ["null", File, File[], Directory, Directory[], Dirent]}`.\n\nFiles or Directories which are listed in the input parameters and\nappear in the `InitialWorkDirRequirement` listing must have their\n`path` set to their staged location in the designated output directory.\nIf the same File or Directory appears more than once in the\n`InitialWorkDirRequirement` listing, the implementation must choose\nexactly one value for `path`; how this value is chosen is undefined.\n'}]}, {'name': 'EnvVarRequirement', 'type': 'record', 'extends': 'https://w3id.org/cwl/cwl#ProcessRequirement', 'doc': 'Define a list of environment variables which will be set in the\nexecution environment of the tool. See `EnvironmentDef` for details.\n', 'fields': [{'name': 'class', 'type': 'string', 'doc': "Always 'EnvVarRequirement'", 'jsonldPredicate': {'_id': '@type', '_type': '@vocab'}}, {'name': 'envDef', 'type': {'type': 'array', 'items': 'EnvironmentDef', 'name': ''}, 'doc': 'The list of environment variables.', 'jsonldPredicate': {'mapSubject': 'envName', 'mapPredicate': 'envValue'}}]}, {'type': 'record', 'name': 'ShellCommandRequirement', 'extends': 'https://w3id.org/cwl/cwl#ProcessRequirement', 'doc': 'Modify the behavior of CommandLineTool to generate a single string\ncontaining a shell command line. Each item in the argument list must be\njoined into a string separated by single spaces and quoted to prevent\nintepretation by the shell, unless `CommandLineBinding` for that argument\ncontains `shellQuote: false`. If `shellQuote: false` is specified, the\nargument is joined into the command string without quoting, which allows\nthe use of shell metacharacters such as `|` for pipes.\n', 'fields': [{'name': 'class', 'type': 'string', 'doc': "Always 'ShellCommandRequirement'", 'jsonldPredicate': {'_id': '@type', '_type': '@vocab'}}]}, {'type': 'record', 'name': 'ResourceRequirement', 'extends': 'https://w3id.org/cwl/cwl#ProcessRequirement', 'doc': 'Specify basic hardware resource requirements.\n\n"min" is the minimum amount of a resource that must be reserved to schedule\na job. If "min" cannot be satisfied, the job should not be run.\n\n"max" is the maximum amount of a resource that the job shall be permitted\nto use. If a node has sufficient resources, multiple jobs may be scheduled\non a single node provided each job\'s "max" resource requirements are\nmet. If a job attempts to exceed its "max" resource allocation, an\nimplementation may deny additional resources, which may result in job\nfailure.\n\nIf "min" is specified but "max" is not, then "max" == "min"\nIf "max" is specified by "min" is not, then "min" == "max".\n\nIt is an error if max < min.\n\nIt is an error if the value of any of these fields is negative.\n\nIf neither "min" nor "max" is specified for a resource, use the default values below.\n', 'fields': [{'name': 'class', 'type': 'string', 'doc': "Always 'ResourceRequirement'", 'jsonldPredicate': {'_id': '@type', '_type': '@vocab'}}, {'name': 'coresMin', 'type': ['null', 'long', 'Expression'], 'doc': 'Minimum reserved number of CPU cores (default is 1)'}, {'name': 'coresMax', 'type': ['null', 'int', 'Expression'], 'doc': 'Maximum reserved number of CPU cores'}, {'name': 'ramMin', 'type': ['null', 'long', 'Expression'], 'doc': 'Minimum reserved RAM in mebibytes (2**20) (default is 256)'}, {'name': 'ramMax', 'type': ['null', 'long', 'Expression'], 'doc': 'Maximum reserved RAM in mebibytes (2**20)'}, {'name': 'tmpdirMin', 'type': ['null', 'long', 'Expression'], 'doc': 'Minimum reserved filesystem based storage for the designated temporary directory, in mebibytes (2**20) (default is 1024)'}, {'name': 'tmpdirMax', 'type': ['null', 'long', 'Expression'], 'doc': 'Maximum reserved filesystem based storage for the designated temporary directory, in mebibytes (2**20)'}, {'name': 'outdirMin', 'type': ['null', 'long', 'Expression'], 'doc': 'Minimum reserved filesystem based storage for the designated output directory, in mebibytes (2**20) (default is 1024)'}, {'name': 'outdirMax', 'type': ['null', 'long', 'Expression'], 'doc': 'Maximum reserved filesystem based storage for the designated output directory, in mebibytes (2**20)'}]}, {'type': 'record', 'name': 'WorkReuse', 'extends': 'https://w3id.org/cwl/cwl#ProcessRequirement', 'doc': 'For implementations that support reusing output from past work (on\nthe assumption that same code and same input produce same\nresults), control whether to enable or disable the reuse behavior\nfor a particular tool or step (to accomodate situations where that\nassumption is incorrect). A reused step is not executed but\ninstead returns the same output as the original execution.\n\nIf `enableReuse` is not specified, correct tools should assume it\nis enabled by default.\n', 'fields': [{'name': 'class', 'type': 'string', 'doc': "Always 'WorkReuse'", 'jsonldPredicate': {'_id': '@type', '_type': '@vocab'}}, {'name': 'enableReuse', 'type': ['boolean', 'Expression'], 'default': True}]}, {'type': 'record', 'name': 'NetworkAccess', 'extends': 'https://w3id.org/cwl/cwl#ProcessRequirement', 'doc': 'Indicate whether a process requires outgoing IPv4/IPv6 network\naccess. Choice of IPv4 or IPv6 is implementation and site\nspecific, correct tools must support both.\n\nIf `networkAccess` is false or not specified, tools must not\nassume network access, except for localhost (the loopback device).\n\nIf `networkAccess` is true, the tool must be able to make outgoing\nconnections to network resources. Resources may be on a private\nsubnet or the public Internet. However, implementations and sites\nmay apply their own security policies to restrict what is\naccessible by the tool.\n\nEnabling network access does not imply a publically routable IP\naddress or the ability to accept inbound connections.\n', 'fields': [{'name': 'class', 'type': 'string', 'doc': "Always 'NetworkAccess'", 'jsonldPredicate': {'_id': '@type', '_type': '@vocab'}}, {'name': 'networkAccess', 'type': ['boolean', 'Expression']}]}, {'name': 'InplaceUpdateRequirement', 'type': 'record', 'extends': 'https://w3id.org/cwl/cwl#ProcessRequirement', 'doc': '\nIf `inplaceUpdate` is true, then an implementation supporting this\nfeature may permit tools to directly update files with `writable:\ntrue` in InitialWorkDirRequirement. That is, as an optimization,\nfiles may be destructively modified in place as opposed to copied\nand updated.\n\nAn implementation must ensure that only one workflow step may\naccess a writable file at a time. It is an error if a file which\nis writable by one workflow step file is accessed (for reading or\nwriting) by any other workflow step running independently.\nHowever, a file which has been updated in a previous completed\nstep may be used as input to multiple steps, provided it is\nread-only in every step.\n\nWorkflow steps which modify a file must produce the modified file\nas output. Downstream steps which futher process the file must\nuse the output of previous steps, and not refer to a common input\n(this is necessary for both ordering and correctness).\n\nWorkflow authors should provide this in the `hints` section. The\nintent of this feature is that workflows produce the same results\nwhether or not InplaceUpdateRequirement is supported by the\nimplementation, and this feature is primarily available as an\noptimization for particular environments.\n\nUsers and implementers should be aware that workflows that\ndestructively modify inputs may not be repeatable or reproducible.\nIn particular, enabling this feature implies that WorkReuse should\nnot be enabled.\n', 'fields': [{'type': 'string', 'doc': "Always 'InplaceUpdateRequirement'", 'jsonldPredicate': {'_id': '@type', '_type': '@vocab'}, 'name': 'class'}, {'type': 'boolean', 'name': 'inplaceUpdate'}]}, {'type': 'record', 'name': 'ToolTimeLimit', 'extends': 'https://w3id.org/cwl/cwl#ProcessRequirement', 'doc': 'Set an upper limit on the execution time of a CommandLineTool.\nA CommandLineTool whose execution duration exceeds the time\nlimit may be preemptively terminated and considered failed.\nMay also be used by batch systems to make scheduling decisions.\nThe execution duration excludes external operations, such as\nstaging of files, pulling a docker image etc, and only counts\nwall-time for the execution of the command line itself.\n', 'fields': [{'name': 'class', 'type': 'string', 'doc': "Always 'ToolTimeLimit'", 'jsonldPredicate': {'_id': '@type', '_type': '@vocab'}}, {'name': 'timelimit', 'type': ['long', 'Expression'], 'doc': 'The time limit, in seconds. A time limit of zero means no\ntime limit. Negative time limits are an error.\n'}]}, {'type': 'record', 'name': 'SubworkflowFeatureRequirement', 'extends': 'https://w3id.org/cwl/cwl#ProcessRequirement', 'doc': 'Indicates that the workflow platform must support nested workflows in\nthe `run` field of [WorkflowStep](#WorkflowStep).\n', 'fields': [{'name': 'class', 'type': 'string', 'doc': "Always 'SubworkflowFeatureRequirement'", 'jsonldPredicate': {'_id': '@type', '_type': '@vocab'}}]}, {'name': 'ScatterFeatureRequirement', 'type': 'record', 'extends': 'https://w3id.org/cwl/cwl#ProcessRequirement', 'doc': 'Indicates that the workflow platform must support the `scatter` and\n`scatterMethod` fields of [WorkflowStep](#WorkflowStep).\n', 'fields': [{'name': 'class', 'type': 'string', 'doc': "Always 'ScatterFeatureRequirement'", 'jsonldPredicate': {'_id': '@type', '_type': '@vocab'}}]}, {'name': 'MultipleInputFeatureRequirement', 'type': 'record', 'extends': 'https://w3id.org/cwl/cwl#ProcessRequirement', 'doc': 'Indicates that the workflow platform must support multiple inbound data links\nlisted in the `source` field of [WorkflowStepInput](#WorkflowStepInput).\n', 'fields': [{'name': 'class', 'type': 'string', 'doc': "Always 'MultipleInputFeatureRequirement'", 'jsonldPredicate': {'_id': '@type', '_type': '@vocab'}}]}, {'type': 'record', 'name': 'StepInputExpressionRequirement', 'extends': 'https://w3id.org/cwl/cwl#ProcessRequirement', 'doc': 'Indicate that the workflow platform must support the `valueFrom` field\nof [WorkflowStepInput](#WorkflowStepInput).\n', 'fields': [{'name': 'class', 'type': 'string', 'doc': "Always 'StepInputExpressionRequirement'", 'jsonldPredicate': {'_id': '@type', '_type': '@vocab'}}]}, {'name': 'http://commonwl.org/cwltool#Secrets', 'type': 'record', 'inVocab': False, 'extends': 'https://w3id.org/cwl/cwl#ProcessRequirement', 'fields': [{'type': 'string', 'doc': "Always 'Secrets'", 'jsonldPredicate': {'_id': '@type', '_type': '@vocab'}, 'name': 'class'}, {'type': {'type': 'array', 'items': 'string', 'name': ''}, 'doc': 'List one or more input parameters that are sensitive (such as passwords)\nwhich will be deliberately obscured from logging.\n', 'jsonldPredicate': {'_type': '@id', 'refScope': 0}, 'name': 'secrets'}]}, {'name': 'http://commonwl.org/cwltool#MPIRequirement', 'type': 'record', 'inVocab': False, 'extends': 'https://w3id.org/cwl/cwl#ProcessRequirement', 'doc': 'Indicates that a process requires an MPI runtime.\n', 'fields': [{'name': 'class', 'type': 'string', 'doc': "Always 'MPIRequirement'", 'jsonldPredicate': {'_id': '@type', '_type': '@vocab'}}, {'name': 'processes', 'type': ['int', 'string'], 'doc': 'The number of MPI processes to start. If you give a string,\nthis will be evaluated as a CWL Expression and it must\nevaluate to an integer.\n'}]}, {'name': 'http://commonwl.org/cwltool#StepNameHint', 'type': 'record', 'inVocab': False, 'extends': 'https://w3id.org/cwl/cwl#ProcessRequirement', 'doc': 'Provide a hint for naming the runtime workflow step in logs or user interface.\n', 'fields': [{'name': 'class', 'type': 'string', 'doc': "Always 'StepNameHint'", 'jsonldPredicate': {'_id': '@type', '_type': '@vocab'}}, {'name': 'stepname', 'type': ['string', 'Expression'], 'doc': 'A string or expression returning a string with the preferred name for the step.\nIf it is an expression, it is evaluated after the input object has been completely determined.\n'}]}]) not a valid Avro schema: Union item must be a valid Avro schema: Type property "['string', 'Expression']" not a valid Avro schema: Union item must be a valid Avro schema: Could not make an Avro Schema object from Expression.. Expression. {'name': 'http://commonwl.org/cwltool#StepNameHint', 'type': 'record', 'inVocab': False, 'extends': 'https://w3id.org/cwl/cwl#ProcessRequirement', 'doc': 'Provide a hint for naming the runtime workflow step in logs or user interface.\n', 'fields': [{'name': 'class', 'type': 'string', 'doc': "Always 'StepNameHint'", 'jsonldPredicate': {'_id': '@type', '_type': '@vocab'}}, {'name': 'stepname', 'type': ['string', 'Expression'], 'doc': 'A string or expression returning a string with the preferred name for the step.\nIf it is an expression, it is evaluated after the input object has been completely determined.\n'}]} (known names: ['PrimitiveType', 'Any', 'RecordField', 'RecordSchema', 'enum_d9cba076fca539106791a4f46d198c7fcfbdb779', 'EnumSchema', 'enum_d961d79c225752b9fadb617367615ab176b47d77', 'ArraySchema', 'enum_d062602be0b4b8fd33e69e29a841317b6ab665bc', 'CWLVersion', 'CWLType', 'File', 'File_class', 'Directory', 'Directory_class', 'LoadListingEnum', 'Expression', 'InputBinding', 'InputRecordField', 'InputRecordSchema', 'InputEnumSchema', 'InputArraySchema', 'SecondaryFileSchema', 'OutputRecordField', 'OutputRecordSchema', 'OutputEnumSchema', 'OutputArraySchema', 'InlineJavascriptRequirement', 'SchemaDefRequirement', 'CommandInputRecordSchema', 'CommandInputRecordField', 'CommandInputEnumSchema', 'CommandLineBinding', 'CommandInputArraySchema', 'LoadListingRequirement', 'EnvironmentDef', 'CommandOutputBinding', 'CommandLineBindable', 'CommandOutputRecordField', 'CommandOutputRecordSchema', 'CommandOutputEnumSchema', 'CommandOutputArraySchema', 'CommandInputParameter', 'stdin', 'CommandOutputParameter', 'stdout', 'stderr', 'CommandLineTool', 'DockerRequirement', 'SoftwareRequirement', 'SoftwarePackage', 'InitialWorkDirRequirement', 'Dirent', 'EnvVarRequirement', 'ShellCommandRequirement', 'ResourceRequirement', 'WorkReuse', 'NetworkAccess', 'InplaceUpdateRequirement', 'ToolTimeLimit', 'SubworkflowFeatureRequirement', 'ScatterFeatureRequirement', 'MultipleInputFeatureRequirement', 'StepInputExpressionRequirement', 'http://commonwl.org/cwltool#Secrets', 'http://commonwl.Any', 'http://commonwl.org/cwltool#MPIRequirement', 'http://commonwl.org/cwltool#StepNameHint']). {'type': 'array', 'items': ['InlineJavascriptRequirement', 'SchemaDefRequirement', 'LoadListingRequirement', {'type': 'record', 'name': 'DockerRequirement', 'extends': 'https://w3id.org/cwl/cwl#ProcessRequirement', 'doc': "Indicates that a workflow component should be run in a\n[Docker](http://docker.com) or Docker-compatible (such as\n[Singularity](https://www.sylabs.io/) and [udocker](https://github.com/indigo-dc/udocker)) container environment and\nspecifies how to fetch or build the image.\n\nIf a CommandLineTool lists `DockerRequirement` under\n`hints` (or `requirements`), it may (or must) be run in the specified Docker\ncontainer.\n\nThe platform must first acquire or install the correct Docker image as\nspecified by `dockerPull`, `dockerImport`, `dockerLoad` or `dockerFile`.\n\nThe platform must execute the tool in the container using `docker run` with\nthe appropriate Docker image and tool command line.\n\nThe workflow platform may provide input files and the designated output\ndirectory through the use of volume bind mounts. The platform should rewrite\nfile paths in the input object to correspond to the Docker bind mounted\nlocations. That is, the platform should rewrite values in the parameter context\nsuch as `runtime.outdir`, `runtime.tmpdir` and others to be valid paths\nwithin the container. The platform must ensure that `runtime.outdir` and\n`runtime.tmpdir` are distinct directories.\n\nWhen running a tool contained in Docker, the workflow platform must not\nassume anything about the contents of the Docker container, such as the\npresence or absence of specific software, except to assume that the\ngenerated command line represents a valid command within the runtime\nenvironment of the container.\n\nA container image may specify an\n[ENTRYPOINT](https://docs.docker.com/engine/reference/builder/#entrypoint)\nand/or\n[CMD](https://docs.docker.com/engine/reference/builder/#cmd).\nCommand line arguments will be appended after all elements of\nENTRYPOINT, and will override all elements specified using CMD (in\nother words, CMD is only used when the CommandLineTool definition\nproduces an empty command line).\n\nUse of implicit ENTRYPOINT or CMD are discouraged due to reproducibility\nconcerns of the implicit hidden execution point (For further discussion, see\n[https://doi.org/10.12688/f1000research.15140.1](https://doi.org/10.12688/f1000research.15140.1)). Portable\nCommandLineTool wrappers in which use of a container is optional must not rely on ENTRYPOINT or CMD.\nCommandLineTools which do rely on ENTRYPOINT or CMD must list `DockerRequirement` in the\n`requirements` section.\n\n## Interaction with other requirements\n\nIf [EnvVarRequirement](#EnvVarRequirement) is specified alongside a\nDockerRequirement, the environment variables must be provided to Docker\nusing `--env` or `--env-file` and interact with the container's preexisting\nenvironment as defined by Docker.\n", 'fields': [{'name': 'class', 'type': 'string', 'doc': "Always 'DockerRequirement'", 'jsonldPredicate': {'_id': '@type', '_type': '@vocab'}}, {'name': 'dockerPull', 'type': ['null', 'string'], 'doc': 'Specify a Docker image to retrieve using `docker pull`.'}, {'name': 'dockerLoad', 'type': ['null', 'string'], 'doc': 'Specify a HTTP URL from which to download a Docker image using `docker load`.'}, {'name': 'dockerFile', 'type': ['null', 'string'], 'doc': 'Supply the contents of a Dockerfile which will be built using `docker build`.'}, {'name': 'dockerImport', 'type': ['null', 'string'], 'doc': 'Provide HTTP URL to download and gunzip a Docker images using `docker import.'}, {'name': 'dockerImageId', 'type': ['null', 'string'], 'doc': 'The image id that will be used for `docker run`. May be a\nhuman-readable image name or the image identifier hash. May be skipped\nif `dockerPull` is specified, in which case the `dockerPull` image id\nmust be used.\n'}, {'name': 'dockerOutputDirectory', 'type': ['null', 'string'], 'doc': 'Set the designated output directory to a specific location inside the\nDocker container.\n'}]}, {'type': 'record', 'name': 'SoftwareRequirement', 'extends': 'https://w3id.org/cwl/cwl#ProcessRequirement', 'doc': 'A list of software packages that should be configured in the environment of\nthe defined process.\n', 'fields': [{'name': 'class', 'type': 'string', 'doc': "Always 'SoftwareRequirement'", 'jsonldPredicate': {'_id': '@type', '_type': '@vocab'}}, {'name': 'packages', 'type': {'type': 'array', 'items': {'name': 'SoftwarePackage', 'type': 'record', 'fields': [{'name': 'package', 'type': 'string', 'doc': 'The name of the software to be made available. If the name is\ncommon, inconsistent, or otherwise ambiguous it should be combined with\none or more identifiers in the `specs` field.\n'}, {'name': 'version', 'type': ['null', {'type': 'array', 'items': 'string', 'name': ''}], 'doc': 'The (optional) versions of the software that are known to be\ncompatible.\n'}, {'name': 'specs', 'type': ['null', {'type': 'array', 'items': 'string', 'name': ''}], 'jsonldPredicate': {'_type': '@id', 'noLinkCheck': True}, 'doc': 'One or more [IRI](https://en.wikipedia.org/wiki/Internationalized_Resource_Identifier)s\nidentifying resources for installing or enabling the software named in\nthe `package` field. Implementations may provide resolvers which map\nthese software identifer IRIs to some configuration action; or they can\nuse only the name from the `package` field on a best effort basis.\n\nFor example, the IRI https://packages.debian.org/bowtie could\nbe resolved with `apt-get install bowtie`. The IRI\nhttps://anaconda.org/bioconda/bowtie could be resolved with `conda\ninstall -c bioconda bowtie`.\n\nIRIs can also be system independent and used to map to a specific\nsoftware installation or selection mechanism.\nUsing [RRID](https://www.identifiers.org/rrid/) as an example:\nhttps://identifiers.org/rrid/RRID:SCR_005476\ncould be fulfilled using the above mentioned Debian or bioconda\npackage, a local installation managed by [Environement Modules](http://modules.sourceforge.net/),\nor any other mechanism the platform chooses. IRIs can also be from\nidentifer sources that are discipline specific yet still system\nindependent. As an example, the equivalent [ELIXIR Tools and Data\nService Registry](https://bio.tools) IRI to the previous RRID example is\nhttps://bio.tools/tool/bowtie2/version/2.2.8.\nIf supported by a given registry, implementations are encouraged to\nquery these system independent sofware identifier IRIs directly for\nlinks to packaging systems.\n\nA site specific IRI can be listed as well. For example, an academic\ncomputing cluster using Environement Modules could list the IRI\n`https://hpc.example.edu/modules/bowtie-tbb/1.22` to indicate that\n`module load bowtie-tbb/1.1.2` should be executed to make available\n`bowtie` version 1.1.2 compiled with the TBB library prior to running\nthe accompanying Workflow or CommandLineTool. Note that the example IRI\nis specific to a particular institution and computing environment as\nthe Environment Modules system does not have a common namespace or\nstandardized naming convention.\n\nThis last example is the least portable and should only be used if\nmechanisms based off of the `package` field or more generic IRIs are\nunavailable or unsuitable. While harmless to other sites, site specific\nsoftware IRIs should be left out of shared CWL descriptions to avoid\nclutter.\n'}]}, 'name': ''}, 'doc': 'The list of software to be configured.', 'jsonldPredicate': {'mapSubject': 'package', 'mapPredicate': 'specs'}}]}, {'name': 'InitialWorkDirRequirement', 'type': 'record', 'extends': 'https://w3id.org/cwl/cwl#ProcessRequirement', 'doc': 'Define a list of files and subdirectories that must be created by the workflow platform in the designated output directory prior to executing the command line tool.', 'fields': [{'name': 'class', 'type': 'string', 'doc': 'InitialWorkDirRequirement', 'jsonldPredicate': {'_id': '@type', '_type': '@vocab'}}, {'name': 'listing', 'type': [{'type': 'array', 'items': ['null', 'File', {'type': 'array', 'items': ['File', 'Directory'], 'name': ''}, 'Directory', {'name': 'Dirent', 'type': 'record', 'doc': 'Define a file or subdirectory that must be placed in the designated output\ndirectory prior to executing the command line tool. May be the result of\nexecuting an expression, such as building a configuration file from a\ntemplate.\n', 'fields': [{'name': 'entryname', 'type': ['null', 'string', 'Expression'], 'jsonldPredicate': {'_id': 'https://w3id.org/cwl/cwl#entryname'}, 'doc': 'The name of the file or subdirectory to create in the output directory.\nIf `entry` is a File or Directory, the `entryname` field overrides the value\nof `basename` of the File or Directory object. Optional.\n'}, {'name': 'entry', 'type': ['string', 'Expression'], 'jsonldPredicate': {'_id': 'https://w3id.org/cwl/cwl#entry'}, 'doc': 'If the value is a string literal or an expression which evaluates to a\nstring, a new file must be created with the string as the file contents.\n\nIf the value is an expression that evaluates to a `File` object, this\nindicates the referenced file should be added to the designated output\ndirectory prior to executing the tool.\n\nIf the value is an expression that evaluates to a `Dirent` object, this\nindicates that the File or Directory in `entry` should be added to the\ndesignated output directory with the name in `entryname`.\n\nIf `writable` is false, the file may be made available using a bind\nmount or file system link to avoid unnecessary copying of the input\nfile.\n'}, {'name': 'writable', 'type': ['null', 'boolean'], 'default': False, 'doc': 'If true, the file or directory must be writable by the tool. Changes\nto the file or directory must be isolated and not visible by any other\nCommandLineTool process. This may be implemented by making a copy of\nthe original file or directory. Default false (files and directories\nread-only by default).\n\nA directory marked as `writable: true` implies that all files and\nsubdirectories are recursively writable as well.\n'}]}, 'Expression'], 'name': ''}, 'Expression'], 'jsonldPredicate': {'_id': 'https://w3id.org/cwl/cwl#listing'}, 'doc': 'The list of files or subdirectories that must be placed in the\ndesignated output directory prior to executing the command line tool.\n\nMay be an expression. If so, the expression return value must validate as\n`{type: array, items: ["null", File, File[], Directory, Directory[], Dirent]}`.\n\nFiles or Directories which are listed in the input parameters and\nappear in the `InitialWorkDirRequirement` listing must have their\n`path` set to their staged location in the designated output directory.\nIf the same File or Directory appears more than once in the\n`InitialWorkDirRequirement` listing, the implementation must choose\nexactly one value for `path`; how this value is chosen is undefined.\n'}]}, {'name': 'EnvVarRequirement', 'type': 'record', 'extends': 'https://w3id.org/cwl/cwl#ProcessRequirement', 'doc': 'Define a list of environment variables which will be set in the\nexecution environment of the tool. See `EnvironmentDef` for details.\n', 'fields': [{'name': 'class', 'type': 'string', 'doc': "Always 'EnvVarRequirement'", 'jsonldPredicate': {'_id': '@type', '_type': '@vocab'}}, {'name': 'envDef', 'type': {'type': 'array', 'items': 'EnvironmentDef', 'name': ''}, 'doc': 'The list of environment variables.', 'jsonldPredicate': {'mapSubject': 'envName', 'mapPredicate': 'envValue'}}]}, {'type': 'record', 'name': 'ShellCommandRequirement', 'extends': 'https://w3id.org/cwl/cwl#ProcessRequirement', 'doc': 'Modify the behavior of CommandLineTool to generate a single string\ncontaining a shell command line. Each item in the argument list must be\njoined into a string separated by single spaces and quoted to prevent\nintepretation by the shell, unless `CommandLineBinding` for that argument\ncontains `shellQuote: false`. If `shellQuote: false` is specified, the\nargument is joined into the command string without quoting, which allows\nthe use of shell metacharacters such as `|` for pipes.\n', 'fields': [{'name': 'class', 'type': 'string', 'doc': "Always 'ShellCommandRequirement'", 'jsonldPredicate': {'_id': '@type', '_type': '@vocab'}}]}, {'type': 'record', 'name': 'ResourceRequirement', 'extends': 'https://w3id.org/cwl/cwl#ProcessRequirement', 'doc': 'Specify basic hardware resource requirements.\n\n"min" is the minimum amount of a resource that must be reserved to schedule\na job. If "min" cannot be satisfied, the job should not be run.\n\n"max" is the maximum amount of a resource that the job shall be permitted\nto use. If a node has sufficient resources, multiple jobs may be scheduled\non a single node provided each job\'s "max" resource requirements are\nmet. If a job attempts to exceed its "max" resource allocation, an\nimplementation may deny additional resources, which may result in job\nfailure.\n\nIf "min" is specified but "max" is not, then "max" == "min"\nIf "max" is specified by "min" is not, then "min" == "max".\n\nIt is an error if max < min.\n\nIt is an error if the value of any of these fields is negative.\n\nIf neither "min" nor "max" is specified for a resource, use the default values below.\n', 'fields': [{'name': 'class', 'type': 'string', 'doc': "Always 'ResourceRequirement'", 'jsonldPredicate': {'_id': '@type', '_type': '@vocab'}}, {'name': 'coresMin', 'type': ['null', 'long', 'Expression'], 'doc': 'Minimum reserved number of CPU cores (default is 1)'}, {'name': 'coresMax', 'type': ['null', 'int', 'Expression'], 'doc': 'Maximum reserved number of CPU cores'}, {'name': 'ramMin', 'type': ['null', 'long', 'Expression'], 'doc': 'Minimum reserved RAM in mebibytes (2**20) (default is 256)'}, {'name': 'ramMax', 'type': ['null', 'long', 'Expression'], 'doc': 'Maximum reserved RAM in mebibytes (2**20)'}, {'name': 'tmpdirMin', 'type': ['null', 'long', 'Expression'], 'doc': 'Minimum reserved filesystem based storage for the designated temporary directory, in mebibytes (2**20) (default is 1024)'}, {'name': 'tmpdirMax', 'type': ['null', 'long', 'Expression'], 'doc': 'Maximum reserved filesystem based storage for the designated temporary directory, in mebibytes (2**20)'}, {'name': 'outdirMin', 'type': ['null', 'long', 'Expression'], 'doc': 'Minimum reserved filesystem based storage for the designated output directory, in mebibytes (2**20) (default is 1024)'}, {'name': 'outdirMax', 'type': ['null', 'long', 'Expression'], 'doc': 'Maximum reserved filesystem based storage for the designated output directory, in mebibytes (2**20)'}]}, {'type': 'record', 'name': 'WorkReuse', 'extends': 'https://w3id.org/cwl/cwl#ProcessRequirement', 'doc': 'For implementations that support reusing output from past work (on\nthe assumption that same code and same input produce same\nresults), control whether to enable or disable the reuse behavior\nfor a particular tool or step (to accomodate situations where that\nassumption is incorrect). A reused step is not executed but\ninstead returns the same output as the original execution.\n\nIf `enableReuse` is not specified, correct tools should assume it\nis enabled by default.\n', 'fields': [{'name': 'class', 'type': 'string', 'doc': "Always 'WorkReuse'", 'jsonldPredicate': {'_id': '@type', '_type': '@vocab'}}, {'name': 'enableReuse', 'type': ['boolean', 'Expression'], 'default': True}]}, {'type': 'record', 'name': 'NetworkAccess', 'extends': 'https://w3id.org/cwl/cwl#ProcessRequirement', 'doc': 'Indicate whether a process requires outgoing IPv4/IPv6 network\naccess. Choice of IPv4 or IPv6 is implementation and site\nspecific, correct tools must support both.\n\nIf `networkAccess` is false or not specified, tools must not\nassume network access, except for localhost (the loopback device).\n\nIf `networkAccess` is true, the tool must be able to make outgoing\nconnections to network resources. Resources may be on a private\nsubnet or the public Internet. However, implementations and sites\nmay apply their own security policies to restrict what is\naccessible by the tool.\n\nEnabling network access does not imply a publically routable IP\naddress or the ability to accept inbound connections.\n', 'fields': [{'name': 'class', 'type': 'string', 'doc': "Always 'NetworkAccess'", 'jsonldPredicate': {'_id': '@type', '_type': '@vocab'}}, {'name': 'networkAccess', 'type': ['boolean', 'Expression']}]}, {'name': 'InplaceUpdateRequirement', 'type': 'record', 'extends': 'https://w3id.org/cwl/cwl#ProcessRequirement', 'doc': '\nIf `inplaceUpdate` is true, then an implementation supporting this\nfeature may permit tools to directly update files with `writable:\ntrue` in InitialWorkDirRequirement. That is, as an optimization,\nfiles may be destructively modified in place as opposed to copied\nand updated.\n\nAn implementation must ensure that only one workflow step may\naccess a writable file at a time. It is an error if a file which\nis writable by one workflow step file is accessed (for reading or\nwriting) by any other workflow step running independently.\nHowever, a file which has been updated in a previous completed\nstep may be used as input to multiple steps, provided it is\nread-only in every step.\n\nWorkflow steps which modify a file must produce the modified file\nas output. Downstream steps which futher process the file must\nuse the output of previous steps, and not refer to a common input\n(this is necessary for both ordering and correctness).\n\nWorkflow authors should provide this in the `hints` section. The\nintent of this feature is that workflows produce the same results\nwhether or not InplaceUpdateRequirement is supported by the\nimplementation, and this feature is primarily available as an\noptimization for particular environments.\n\nUsers and implementers should be aware that workflows that\ndestructively modify inputs may not be repeatable or reproducible.\nIn particular, enabling this feature implies that WorkReuse should\nnot be enabled.\n', 'fields': [{'type': 'string', 'doc': "Always 'InplaceUpdateRequirement'", 'jsonldPredicate': {'_id': '@type', '_type': '@vocab'}, 'name': 'class'}, {'type': 'boolean', 'name': 'inplaceUpdate'}]}, {'type': 'record', 'name': 'ToolTimeLimit', 'extends': 'https://w3id.org/cwl/cwl#ProcessRequirement', 'doc': 'Set an upper limit on the execution time of a CommandLineTool.\nA CommandLineTool whose execution duration exceeds the time\nlimit may be preemptively terminated and considered failed.\nMay also be used by batch systems to make scheduling decisions.\nThe execution duration excludes external operations, such as\nstaging of files, pulling a docker image etc, and only counts\nwall-time for the execution of the command line itself.\n', 'fields': [{'name': 'class', 'type': 'string', 'doc': "Always 'ToolTimeLimit'", 'jsonldPredicate': {'_id': '@type', '_type': '@vocab'}}, {'name': 'timelimit', 'type': ['long', 'Expression'], 'doc': 'The time limit, in seconds. A time limit of zero means no\ntime limit. Negative time limits are an error.\n'}]}, {'type': 'record', 'name': 'SubworkflowFeatureRequirement', 'extends': 'https://w3id.org/cwl/cwl#ProcessRequirement', 'doc': 'Indicates that the workflow platform must support nested workflows in\nthe `run` field of [WorkflowStep](#WorkflowStep).\n', 'fields': [{'name': 'class', 'type': 'string', 'doc': "Always 'SubworkflowFeatureRequirement'", 'jsonldPredicate': {'_id': '@type', '_type': '@vocab'}}]}, {'name': 'ScatterFeatureRequirement', 'type': 'record', 'extends': 'https://w3id.org/cwl/cwl#ProcessRequirement', 'doc': 'Indicates that the workflow platform must support the `scatter` and\n`scatterMethod` fields of [WorkflowStep](#WorkflowStep).\n', 'fields': [{'name': 'class', 'type': 'string', 'doc': "Always 'ScatterFeatureRequirement'", 'jsonldPredicate': {'_id': '@type', '_type': '@vocab'}}]}, {'name': 'MultipleInputFeatureRequirement', 'type': 'record', 'extends': 'https://w3id.org/cwl/cwl#ProcessRequirement', 'doc': 'Indicates that the workflow platform must support multiple inbound data links\nlisted in the `source` field of [WorkflowStepInput](#WorkflowStepInput).\n', 'fields': [{'name': 'class', 'type': 'string', 'doc': "Always 'MultipleInputFeatureRequirement'", 'jsonldPredicate': {'_id': '@type', '_type': '@vocab'}}]}, {'type': 'record', 'name': 'StepInputExpressionRequirement', 'extends': 'https://w3id.org/cwl/cwl#ProcessRequirement', 'doc': 'Indicate that the workflow platform must support the `valueFrom` field\nof [WorkflowStepInput](#WorkflowStepInput).\n', 'fields': [{'name': 'class', 'type': 'string', 'doc': "Always 'StepInputExpressionRequirement'", 'jsonldPredicate': {'_id': '@type', '_type': '@vocab'}}]}, {'name': 'http://commonwl.org/cwltool#Secrets', 'type': 'record', 'inVocab': False, 'extends': 'https://w3id.org/cwl/cwl#ProcessRequirement', 'fields': [{'type': 'string', 'doc': "Always 'Secrets'", 'jsonldPredicate': {'_id': '@type', '_type': '@vocab'}, 'name': 'class'}, {'type': {'type': 'array', 'items': 'string', 'name': ''}, 'doc': 'List one or more input parameters that are sensitive (such as passwords)\nwhich will be deliberately obscured from logging.\n', 'jsonldPredicate': {'_type': '@id', 'refScope': 0}, 'name': 'secrets'}]}, {'name': 'http://commonwl.org/cwltool#MPIRequirement', 'type': 'record', 'inVocab': False, 'extends': 'https://w3id.org/cwl/cwl#ProcessRequirement', 'doc': 'Indicates that a process requires an MPI runtime.\n', 'fields': [{'name': 'class', 'type': 'string', 'doc': "Always 'MPIRequirement'", 'jsonldPredicate': {'_id': '@type', '_type': '@vocab'}}, {'name': 'processes', 'type': ['int', 'string'], 'doc': 'The number of MPI processes to start. If you give a string,\nthis will be evaluated as a CWL Expression and it must\nevaluate to an integer.\n'}]}, {'name': 'http://commonwl.org/cwltool#StepNameHint', 'type': 'record', 'inVocab': False, 'extends': 'https://w3id.org/cwl/cwl#ProcessRequirement', 'doc': 'Provide a hint for naming the runtime workflow step in logs or user interface.\n', 'fields': [{'name': 'class', 'type': 'string', 'doc': "Always 'StepNameHint'", 'jsonldPredicate': {'_id': '@type', '_type': '@vocab'}}, {'name': 'stepname', 'type': ['string', 'Expression'], 'doc': 'A string or expression returning a string with the preferred name for the step.\nIf it is an expression, it is evaluated after the input object has been completely determined.\n'}]}], 'name': ''}. {'type': 'record', 'name': 'CommandLineTool', 'extends': 'https://w3id.org/cwl/cwl#Process', 'documentRoot': True, 'specialize': [{'specializeFrom': 'https://w3id.org/cwl/cwl#InputParameter', 'specializeTo': 'https://w3id.org/cwl/cwl#CommandInputParameter'}, {'specializeFrom': 'https://w3id.org/cwl/cwl#OutputParameter', 'specializeTo': 'https://w3id.org/cwl/cwl#CommandOutputParameter'}], 'doc': 'This defines the schema of the CWL Command Line Tool Description document.\n', 'fields': [{'name': 'id', 'type': ['null', 'string'], 'jsonldPredicate': '@id', 'doc': 'The unique identifier for this object.', 'inherited_from': 'https://w3id.org/cwl/cwl#Identified'}, {'name': 'label', 'type': ['null', 'string'], 'jsonldPredicate': 'rdfs:label', 'doc': 'A short, human-readable label of this object.', 'inherited_from': 'https://w3id.org/cwl/cwl#Labeled'}, {'name': 'doc', 'type': ['null', 'string', {'type': 'array', 'items': 'string', 'name': ''}], 'doc': 'A documentation string for this object, or an array of strings which should be concatenated.', 'jsonldPredicate': 'rdfs:comment', 'inherited_from': 'https://w3id.org/cwl/salad#Documented'}, {'name': 'inputs', 'type': {'type': 'array', 'items': 'CommandInputParameter', 'name': ''}, 'jsonldPredicate': {'_id': 'https://w3id.org/cwl/cwl#inputs', 'mapSubject': 'id', 'mapPredicate': 'type'}, 'doc': 'Defines the input parameters of the process. The process is ready to\nrun when all required input parameters are associated with concrete\nvalues. Input parameters include a schema for each parameter which is\nused to validate the input object. It may also be used to build a user\ninterface for constructing the input object.\n\nWhen accepting an input object, all input parameters must have a value.\nIf an input parameter is missing from the input object, it must be\nassigned a value of `null` (or the value of `default` for that\nparameter, if provided) for the purposes of validation and evaluation\nof expressions.\n', 'inherited_from': 'https://w3id.org/cwl/cwl#Process'}, {'name': 'outputs', 'type': {'type': 'array', 'items': 'CommandOutputParameter', 'name': ''}, 'jsonldPredicate': {'_id': 'https://w3id.org/cwl/cwl#outputs', 'mapSubject': 'id', 'mapPredicate': 'type'}, 'doc': 'Defines the parameters representing the output of the process. May be\nused to generate and/or validate the output object.\n', 'inherited_from': 'https://w3id.org/cwl/cwl#Process'}, {'name': 'requirements', 'type': ['null', {'type': 'array', 'items': ['InlineJavascriptRequirement', 'SchemaDefRequirement', 'LoadListingRequirement', {'type': 'record', 'name': 'DockerRequirement', 'extends': 'https://w3id.org/cwl/cwl#ProcessRequirement', 'doc': "Indicates that a workflow component should be run in a\n[Docker](http://docker.com) or Docker-compatible (such as\n[Singularity](https://www.sylabs.io/) and [udocker](https://github.com/indigo-dc/udocker)) container environment and\nspecifies how to fetch or build the image.\n\nIf a CommandLineTool lists `DockerRequirement` under\n`hints` (or `requirements`), it may (or must) be run in the specified Docker\ncontainer.\n\nThe platform must first acquire or install the correct Docker image as\nspecified by `dockerPull`, `dockerImport`, `dockerLoad` or `dockerFile`.\n\nThe platform must execute the tool in the container using `docker run` with\nthe appropriate Docker image and tool command line.\n\nThe workflow platform may provide input files and the designated output\ndirectory through the use of volume bind mounts. The platform should rewrite\nfile paths in the input object to correspond to the Docker bind mounted\nlocations. That is, the platform should rewrite values in the parameter context\nsuch as `runtime.outdir`, `runtime.tmpdir` and others to be valid paths\nwithin the container. The platform must ensure that `runtime.outdir` and\n`runtime.tmpdir` are distinct directories.\n\nWhen running a tool contained in Docker, the workflow platform must not\nassume anything about the contents of the Docker container, such as the\npresence or absence of specific software, except to assume that the\ngenerated command line represents a valid command within the runtime\nenvironment of the container.\n\nA container image may specify an\n[ENTRYPOINT](https://docs.docker.com/engine/reference/builder/#entrypoint)\nand/or\n[CMD](https://docs.docker.com/engine/reference/builder/#cmd).\nCommand line arguments will be appended after all elements of\nENTRYPOINT, and will override all elements specified using CMD (in\nother words, CMD is only used when the CommandLineTool definition\nproduces an empty command line).\n\nUse of implicit ENTRYPOINT or CMD are discouraged due to reproducibility\nconcerns of the implicit hidden execution point (For further discussion, see\n[https://doi.org/10.12688/f1000research.15140.1](https://doi.org/10.12688/f1000research.15140.1)). Portable\nCommandLineTool wrappers in which use of a container is optional must not rely on ENTRYPOINT or CMD.\nCommandLineTools which do rely on ENTRYPOINT or CMD must list `DockerRequirement` in the\n`requirements` section.\n\n## Interaction with other requirements\n\nIf [EnvVarRequirement](#EnvVarRequirement) is specified alongside a\nDockerRequirement, the environment variables must be provided to Docker\nusing `--env` or `--env-file` and interact with the container's preexisting\nenvironment as defined by Docker.\n", 'fields': [{'name': 'class', 'type': 'string', 'doc': "Always 'DockerRequirement'", 'jsonldPredicate': {'_id': '@type', '_type': '@vocab'}}, {'name': 'dockerPull', 'type': ['null', 'string'], 'doc': 'Specify a Docker image to retrieve using `docker pull`.'}, {'name': 'dockerLoad', 'type': ['null', 'string'], 'doc': 'Specify a HTTP URL from which to download a Docker image using `docker load`.'}, {'name': 'dockerFile', 'type': ['null', 'string'], 'doc': 'Supply the contents of a Dockerfile which will be built using `docker build`.'}, {'name': 'dockerImport', 'type': ['null', 'string'], 'doc': 'Provide HTTP URL to download and gunzip a Docker images using `docker import.'}, {'name': 'dockerImageId', 'type': ['null', 'string'], 'doc': 'The image id that will be used for `docker run`. May be a\nhuman-readable image name or the image identifier hash. May be skipped\nif `dockerPull` is specified, in which case the `dockerPull` image id\nmust be used.\n'}, {'name': 'dockerOutputDirectory', 'type': ['null', 'string'], 'doc': 'Set the designated output directory to a specific location inside the\nDocker container.\n'}]}, {'type': 'record', 'name': 'SoftwareRequirement', 'extends': 'https://w3id.org/cwl/cwl#ProcessRequirement', 'doc': 'A list of software packages that should be configured in the environment of\nthe defined process.\n', 'fields': [{'name': 'class', 'type': 'string', 'doc': "Always 'SoftwareRequirement'", 'jsonldPredicate': {'_id': '@type', '_type': '@vocab'}}, {'name': 'packages', 'type': {'type': 'array', 'items': {'name': 'SoftwarePackage', 'type': 'record', 'fields': [{'name': 'package', 'type': 'string', 'doc': 'The name of the software to be made available. If the name is\ncommon, inconsistent, or otherwise ambiguous it should be combined with\none or more identifiers in the `specs` field.\n'}, {'name': 'version', 'type': ['null', {'type': 'array', 'items': 'string', 'name': ''}], 'doc': 'The (optional) versions of the software that are known to be\ncompatible.\n'}, {'name': 'specs', 'type': ['null', {'type': 'array', 'items': 'string', 'name': ''}], 'jsonldPredicate': {'_type': '@id', 'noLinkCheck': True}, 'doc': 'One or more [IRI](https://en.wikipedia.org/wiki/Internationalized_Resource_Identifier)s\nidentifying resources for installing or enabling the software named in\nthe `package` field. Implementations may provide resolvers which map\nthese software identifer IRIs to some configuration action; or they can\nuse only the name from the `package` field on a best effort basis.\n\nFor example, the IRI https://packages.debian.org/bowtie could\nbe resolved with `apt-get install bowtie`. The IRI\nhttps://anaconda.org/bioconda/bowtie could be resolved with `conda\ninstall -c bioconda bowtie`.\n\nIRIs can also be system independent and used to map to a specific\nsoftware installation or selection mechanism.\nUsing [RRID](https://www.identifiers.org/rrid/) as an example:\nhttps://identifiers.org/rrid/RRID:SCR_005476\ncould be fulfilled using the above mentioned Debian or bioconda\npackage, a local installation managed by [Environement Modules](http://modules.sourceforge.net/),\nor any other mechanism the platform chooses. IRIs can also be from\nidentifer sources that are discipline specific yet still system\nindependent. As an example, the equivalent [ELIXIR Tools and Data\nService Registry](https://bio.tools) IRI to the previous RRID example is\nhttps://bio.tools/tool/bowtie2/version/2.2.8.\nIf supported by a given registry, implementations are encouraged to\nquery these system independent sofware identifier IRIs directly for\nlinks to packaging systems.\n\nA site specific IRI can be listed as well. For example, an academic\ncomputing cluster using Environement Modules could list the IRI\n`https://hpc.example.edu/modules/bowtie-tbb/1.22` to indicate that\n`module load bowtie-tbb/1.1.2` should be executed to make available\n`bowtie` version 1.1.2 compiled with the TBB library prior to running\nthe accompanying Workflow or CommandLineTool. Note that the example IRI\nis specific to a particular institution and computing environment as\nthe Environment Modules system does not have a common namespace or\nstandardized naming convention.\n\nThis last example is the least portable and should only be used if\nmechanisms based off of the `package` field or more generic IRIs are\nunavailable or unsuitable. While harmless to other sites, site specific\nsoftware IRIs should be left out of shared CWL descriptions to avoid\nclutter.\n'}]}, 'name': ''}, 'doc': 'The list of software to be configured.', 'jsonldPredicate': {'mapSubject': 'package', 'mapPredicate': 'specs'}}]}, {'name': 'InitialWorkDirRequirement', 'type': 'record', 'extends': 'https://w3id.org/cwl/cwl#ProcessRequirement', 'doc': 'Define a list of files and subdirectories that must be created by the workflow platform in the designated output directory prior to executing the command line tool.', 'fields': [{'name': 'class', 'type': 'string', 'doc': 'InitialWorkDirRequirement', 'jsonldPredicate': {'_id': '@type', '_type': '@vocab'}}, {'name': 'listing', 'type': [{'type': 'array', 'items': ['null', 'File', {'type': 'array', 'items': ['File', 'Directory'], 'name': ''}, 'Directory', {'name': 'Dirent', 'type': 'record', 'doc': 'Define a file or subdirectory that must be placed in the designated output\ndirectory prior to executing the command line tool. May be the result of\nexecuting an expression, such as building a configuration file from a\ntemplate.\n', 'fields': [{'name': 'entryname', 'type': ['null', 'string', 'Expression'], 'jsonldPredicate': {'_id': 'https://w3id.org/cwl/cwl#entryname'}, 'doc': 'The name of the file or subdirectory to create in the output directory.\nIf `entry` is a File or Directory, the `entryname` field overrides the value\nof `basename` of the File or Directory object. Optional.\n'}, {'name': 'entry', 'type': ['string', 'Expression'], 'jsonldPredicate': {'_id': 'https://w3id.org/cwl/cwl#entry'}, 'doc': 'If the value is a string literal or an expression which evaluates to a\nstring, a new file must be created with the string as the file contents.\n\nIf the value is an expression that evaluates to a `File` object, this\nindicates the referenced file should be added to the designated output\ndirectory prior to executing the tool.\n\nIf the value is an expression that evaluates to a `Dirent` object, this\nindicates that the File or Directory in `entry` should be added to the\ndesignated output directory with the name in `entryname`.\n\nIf `writable` is false, the file may be made available using a bind\nmount or file system link to avoid unnecessary copying of the input\nfile.\n'}, {'name': 'writable', 'type': ['null', 'boolean'], 'default': False, 'doc': 'If true, the file or directory must be writable by the tool. Changes\nto the file or directory must be isolated and not visible by any other\nCommandLineTool process. This may be implemented by making a copy of\nthe original file or directory. Default false (files and directories\nread-only by default).\n\nA directory marked as `writable: true` implies that all files and\nsubdirectories are recursively writable as well.\n'}]}, 'Expression'], 'name': ''}, 'Expression'], 'jsonldPredicate': {'_id': 'https://w3id.org/cwl/cwl#listing'}, 'doc': 'The list of files or subdirectories that must be placed in the\ndesignated output directory prior to executing the command line tool.\n\nMay be an expression. If so, the expression return value must validate as\n`{type: array, items: ["null", File, File[], Directory, Directory[], Dirent]}`.\n\nFiles or Directories which are listed in the input parameters and\nappear in the `InitialWorkDirRequirement` listing must have their\n`path` set to their staged location in the designated output directory.\nIf the same File or Directory appears more than once in the\n`InitialWorkDirRequirement` listing, the implementation must choose\nexactly one value for `path`; how this value is chosen is undefined.\n'}]}, {'name': 'EnvVarRequirement', 'type': 'record', 'extends': 'https://w3id.org/cwl/cwl#ProcessRequirement', 'doc': 'Define a list of environment variables which will be set in the\nexecution environment of the tool. See `EnvironmentDef` for details.\n', 'fields': [{'name': 'class', 'type': 'string', 'doc': "Always 'EnvVarRequirement'", 'jsonldPredicate': {'_id': '@type', '_type': '@vocab'}}, {'name': 'envDef', 'type': {'type': 'array', 'items': 'EnvironmentDef', 'name': ''}, 'doc': 'The list of environment variables.', 'jsonldPredicate': {'mapSubject': 'envName', 'mapPredicate': 'envValue'}}]}, {'type': 'record', 'name': 'ShellCommandRequirement', 'extends': 'https://w3id.org/cwl/cwl#ProcessRequirement', 'doc': 'Modify the behavior of CommandLineTool to generate a single string\ncontaining a shell command line. Each item in the argument list must be\njoined into a string separated by single spaces and quoted to prevent\nintepretation by the shell, unless `CommandLineBinding` for that argument\ncontains `shellQuote: false`. If `shellQuote: false` is specified, the\nargument is joined into the command string without quoting, which allows\nthe use of shell metacharacters such as `|` for pipes.\n', 'fields': [{'name': 'class', 'type': 'string', 'doc': "Always 'ShellCommandRequirement'", 'jsonldPredicate': {'_id': '@type', '_type': '@vocab'}}]}, {'type': 'record', 'name': 'ResourceRequirement', 'extends': 'https://w3id.org/cwl/cwl#ProcessRequirement', 'doc': 'Specify basic hardware resource requirements.\n\n"min" is the minimum amount of a resource that must be reserved to schedule\na job. If "min" cannot be satisfied, the job should not be run.\n\n"max" is the maximum amount of a resource that the job shall be permitted\nto use. If a node has sufficient resources, multiple jobs may be scheduled\non a single node provided each job\'s "max" resource requirements are\nmet. If a job attempts to exceed its "max" resource allocation, an\nimplementation may deny additional resources, which may result in job\nfailure.\n\nIf "min" is specified but "max" is not, then "max" == "min"\nIf "max" is specified by "min" is not, then "min" == "max".\n\nIt is an error if max < min.\n\nIt is an error if the value of any of these fields is negative.\n\nIf neither "min" nor "max" is specified for a resource, use the default values below.\n', 'fields': [{'name': 'class', 'type': 'string', 'doc': "Always 'ResourceRequirement'", 'jsonldPredicate': {'_id': '@type', '_type': '@vocab'}}, {'name': 'coresMin', 'type': ['null', 'long', 'Expression'], 'doc': 'Minimum reserved number of CPU cores (default is 1)'}, {'name': 'coresMax', 'type': ['null', 'int', 'Expression'], 'doc': 'Maximum reserved number of CPU cores'}, {'name': 'ramMin', 'type': ['null', 'long', 'Expression'], 'doc': 'Minimum reserved RAM in mebibytes (2**20) (default is 256)'}, {'name': 'ramMax', 'type': ['null', 'long', 'Expression'], 'doc': 'Maximum reserved RAM in mebibytes (2**20)'}, {'name': 'tmpdirMin', 'type': ['null', 'long', 'Expression'], 'doc': 'Minimum reserved filesystem based storage for the designated temporary directory, in mebibytes (2**20) (default is 1024)'}, {'name': 'tmpdirMax', 'type': ['null', 'long', 'Expression'], 'doc': 'Maximum reserved filesystem based storage for the designated temporary directory, in mebibytes (2**20)'}, {'name': 'outdirMin', 'type': ['null', 'long', 'Expression'], 'doc': 'Minimum reserved filesystem based storage for the designated output directory, in mebibytes (2**20) (default is 1024)'}, {'name': 'outdirMax', 'type': ['null', 'long', 'Expression'], 'doc': 'Maximum reserved filesystem based storage for the designated output directory, in mebibytes (2**20)'}]}, {'type': 'record', 'name': 'WorkReuse', 'extends': 'https://w3id.org/cwl/cwl#ProcessRequirement', 'doc': 'For implementations that support reusing output from past work (on\nthe assumption that same code and same input produce same\nresults), control whether to enable or disable the reuse behavior\nfor a particular tool or step (to accomodate situations where that\nassumption is incorrect). A reused step is not executed but\ninstead returns the same output as the original execution.\n\nIf `enableReuse` is not specified, correct tools should assume it\nis enabled by default.\n', 'fields': [{'name': 'class', 'type': 'string', 'doc': "Always 'WorkReuse'", 'jsonldPredicate': {'_id': '@type', '_type': '@vocab'}}, {'name': 'enableReuse', 'type': ['boolean', 'Expression'], 'default': True}]}, {'type': 'record', 'name': 'NetworkAccess', 'extends': 'https://w3id.org/cwl/cwl#ProcessRequirement', 'doc': 'Indicate whether a process requires outgoing IPv4/IPv6 network\naccess. Choice of IPv4 or IPv6 is implementation and site\nspecific, correct tools must support both.\n\nIf `networkAccess` is false or not specified, tools must not\nassume network access, except for localhost (the loopback device).\n\nIf `networkAccess` is true, the tool must be able to make outgoing\nconnections to network resources. Resources may be on a private\nsubnet or the public Internet. However, implementations and sites\nmay apply their own security policies to restrict what is\naccessible by the tool.\n\nEnabling network access does not imply a publically routable IP\naddress or the ability to accept inbound connections.\n', 'fields': [{'name': 'class', 'type': 'string', 'doc': "Always 'NetworkAccess'", 'jsonldPredicate': {'_id': '@type', '_type': '@vocab'}}, {'name': 'networkAccess', 'type': ['boolean', 'Expression']}]}, {'name': 'InplaceUpdateRequirement', 'type': 'record', 'extends': 'https://w3id.org/cwl/cwl#ProcessRequirement', 'doc': '\nIf `inplaceUpdate` is true, then an implementation supporting this\nfeature may permit tools to directly update files with `writable:\ntrue` in InitialWorkDirRequirement. That is, as an optimization,\nfiles may be destructively modified in place as opposed to copied\nand updated.\n\nAn implementation must ensure that only one workflow step may\naccess a writable file at a time. It is an error if a file which\nis writable by one workflow step file is accessed (for reading or\nwriting) by any other workflow step running independently.\nHowever, a file which has been updated in a previous completed\nstep may be used as input to multiple steps, provided it is\nread-only in every step.\n\nWorkflow steps which modify a file must produce the modified file\nas output. Downstream steps which futher process the file must\nuse the output of previous steps, and not refer to a common input\n(this is necessary for both ordering and correctness).\n\nWorkflow authors should provide this in the `hints` section. The\nintent of this feature is that workflows produce the same results\nwhether or not InplaceUpdateRequirement is supported by the\nimplementation, and this feature is primarily available as an\noptimization for particular environments.\n\nUsers and implementers should be aware that workflows that\ndestructively modify inputs may not be repeatable or reproducible.\nIn particular, enabling this feature implies that WorkReuse should\nnot be enabled.\n', 'fields': [{'type': 'string', 'doc': "Always 'InplaceUpdateRequirement'", 'jsonldPredicate': {'_id': '@type', '_type': '@vocab'}, 'name': 'class'}, {'type': 'boolean', 'name': 'inplaceUpdate'}]}, {'type': 'record', 'name': 'ToolTimeLimit', 'extends': 'https://w3id.org/cwl/cwl#ProcessRequirement', 'doc': 'Set an upper limit on the execution time of a CommandLineTool.\nA CommandLineTool whose execution duration exceeds the time\nlimit may be preemptively terminated and considered failed.\nMay also be used by batch systems to make scheduling decisions.\nThe execution duration excludes external operations, such as\nstaging of files, pulling a docker image etc, and only counts\nwall-time for the execution of the command line itself.\n', 'fields': [{'name': 'class', 'type': 'string', 'doc': "Always 'ToolTimeLimit'", 'jsonldPredicate': {'_id': '@type', '_type': '@vocab'}}, {'name': 'timelimit', 'type': ['long', 'Expression'], 'doc': 'The time limit, in seconds. A time limit of zero means no\ntime limit. Negative time limits are an error.\n'}]}, {'type': 'record', 'name': 'SubworkflowFeatureRequirement', 'extends': 'https://w3id.org/cwl/cwl#ProcessRequirement', 'doc': 'Indicates that the workflow platform must support nested workflows in\nthe `run` field of [WorkflowStep](#WorkflowStep).\n', 'fields': [{'name': 'class', 'type': 'string', 'doc': "Always 'SubworkflowFeatureRequirement'", 'jsonldPredicate': {'_id': '@type', '_type': '@vocab'}}]}, {'name': 'ScatterFeatureRequirement', 'type': 'record', 'extends': 'https://w3id.org/cwl/cwl#ProcessRequirement', 'doc': 'Indicates that the workflow platform must support the `scatter` and\n`scatterMethod` fields of [WorkflowStep](#WorkflowStep).\n', 'fields': [{'name': 'class', 'type': 'string', 'doc': "Always 'ScatterFeatureRequirement'", 'jsonldPredicate': {'_id': '@type', '_type': '@vocab'}}]}, {'name': 'MultipleInputFeatureRequirement', 'type': 'record', 'extends': 'https://w3id.org/cwl/cwl#ProcessRequirement', 'doc': 'Indicates that the workflow platform must support multiple inbound data links\nlisted in the `source` field of [WorkflowStepInput](#WorkflowStepInput).\n', 'fields': [{'name': 'class', 'type': 'string', 'doc': "Always 'MultipleInputFeatureRequirement'", 'jsonldPredicate': {'_id': '@type', '_type': '@vocab'}}]}, {'type': 'record', 'name': 'StepInputExpressionRequirement', 'extends': 'https://w3id.org/cwl/cwl#ProcessRequirement', 'doc': 'Indicate that the workflow platform must support the `valueFrom` field\nof [WorkflowStepInput](#WorkflowStepInput).\n', 'fields': [{'name': 'class', 'type': 'string', 'doc': "Always 'StepInputExpressionRequirement'", 'jsonldPredicate': {'_id': '@type', '_type': '@vocab'}}]}, {'name': 'http://commonwl.org/cwltool#Secrets', 'type': 'record', 'inVocab': False, 'extends': 'https://w3id.org/cwl/cwl#ProcessRequirement', 'fields': [{'type': 'string', 'doc': "Always 'Secrets'", 'jsonldPredicate': {'_id': '@type', '_type': '@vocab'}, 'name': 'class'}, {'type': {'type': 'array', 'items': 'string', 'name': ''}, 'doc': 'List one or more input parameters that are sensitive (such as passwords)\nwhich will be deliberately obscured from logging.\n', 'jsonldPredicate': {'_type': '@id', 'refScope': 0}, 'name': 'secrets'}]}, {'name': 'http://commonwl.org/cwltool#MPIRequirement', 'type': 'record', 'inVocab': False, 'extends': 'https://w3id.org/cwl/cwl#ProcessRequirement', 'doc': 'Indicates that a process requires an MPI runtime.\n', 'fields': [{'name': 'class', 'type': 'string', 'doc': "Always 'MPIRequirement'", 'jsonldPredicate': {'_id': '@type', '_type': '@vocab'}}, {'name': 'processes', 'type': ['int', 'string'], 'doc': 'The number of MPI processes to start. If you give a string,\nthis will be evaluated as a CWL Expression and it must\nevaluate to an integer.\n'}]}, {'name': 'http://commonwl.org/cwltool#StepNameHint', 'type': 'record', 'inVocab': False, 'extends': 'https://w3id.org/cwl/cwl#ProcessRequirement', 'doc': 'Provide a hint for naming the runtime workflow step in logs or user interface.\n', 'fields': [{'name': 'class', 'type': 'string', 'doc': "Always 'StepNameHint'", 'jsonldPredicate': {'_id': '@type', '_type': '@vocab'}}, {'name': 'stepname', 'type': ['string', 'Expression'], 'doc': 'A string or expression returning a string with the preferred name for the step.\nIf it is an expression, it is evaluated after the input object has been completely determined.\n'}]}], 'name': ''}], 'jsonldPredicate': {'_id': 'https://w3id.org/cwl/cwl#requirements', 'mapSubject': 'class'}, 'doc': 'Declares requirements that apply to either the runtime environment or the\nworkflow engine that must be met in order to execute this process. If\nan implementation cannot satisfy all requirements, or a requirement is\nlisted which is not recognized by the implementation, it is a fatal\nerror and the implementation must not attempt to run the process,\nunless overridden at user option.\n', 'inherited_from': 'https://w3id.org/cwl/cwl#Process'}, {'name': 'hints', 'type': ['null', {'type': 'array', 'items': 'Any', 'name': ''}], 'doc': 'Declares hints applying to either the runtime environment or the\nworkflow engine that may be helpful in executing this process. It is\nnot an error if an implementation cannot satisfy all hints, however\nthe implementation may report a warning.\n', 'jsonldPredicate': {'_id': 'https://w3id.org/cwl/cwl#hints', 'noLinkCheck': True, 'mapSubject': 'class'}, 'inherited_from': 'https://w3id.org/cwl/cwl#Process'}, {'name': 'cwlVersion', 'type': ['null', 'CWLVersion'], 'doc': 'CWL document version. Always required at the document root. Not\nrequired for a Process embedded inside another Process.\n', 'jsonldPredicate': {'_id': 'https://w3id.org/cwl/cwl#cwlVersion', '_type': '@vocab'}, 'inherited_from': 'https://w3id.org/cwl/cwl#Process'}, {'name': 'class', 'jsonldPredicate': {'_id': '@type', '_type': '@vocab'}, 'type': 'string'}, {'name': 'baseCommand', 'doc': 'Specifies the program to execute. If an array, the first element of\nthe array is the command to execute, and subsequent elements are\nmandatory command line arguments. The elements in `baseCommand` must\nappear before any command line bindings from `inputBinding` or\n`arguments`.\n\nIf `baseCommand` is not provided or is an empty array, the first\nelement of the command line produced after processing `inputBinding` or\n`arguments` must be used as the program to execute.\n\nIf the program includes a path separator character it must\nbe an absolute path, otherwise it is an error. If the program does not\ninclude a path separator, search the `$PATH` variable in the runtime\nenvironment of the workflow runner find the absolute path of the\nexecutable.\n', 'type': ['null', 'string', {'type': 'array', 'items': 'string', 'name': ''}], 'jsonldPredicate': {'_id': 'https://w3id.org/cwl/cwl#baseCommand', '_container': '@list'}}, {'name': 'arguments', 'doc': 'Command line bindings which are not directly associated with input\nparameters. If the value is a string, it is used as a string literal\nargument. If it is an Expression, the result of the evaluation is used\nas an argument.\n', 'type': ['null', {'type': 'array', 'items': ['string', 'Expression', 'CommandLineBinding'], 'name': ''}], 'jsonldPredicate': {'_id': 'https://w3id.org/cwl/cwl#arguments', '_container': '@list'}}, {'name': 'stdin', 'type': ['null', 'string', 'Expression'], 'jsonldPredicate': 'https://w3id.org/cwl/cwl#stdin', 'doc': "A path to a file whose contents must be piped into the command's\nstandard input stream.\n"}, {'name': 'stderr', 'type': ['null', 'string', 'Expression'], 'jsonldPredicate': 'https://w3id.org/cwl/cwl#stderr', 'doc': "Capture the command's standard error stream to a file written to\nthe designated output directory.\n\nIf `stderr` is a string, it specifies the file name to use.\n\nIf `stderr` is an expression, the expression is evaluated and must\nreturn a string with the file name to use to capture stderr. If the\nreturn value is not a string, or the resulting path contains illegal\ncharacters (such as the path separator `/`) it is an error.\n"}, {'name': 'stdout', 'type': ['null', 'string', 'Expression'], 'jsonldPredicate': 'https://w3id.org/cwl/cwl#stdout', 'doc': "Capture the command's standard output stream to a file written to\nthe designated output directory.\n\nIf `stdout` is a string, it specifies the file name to use.\n\nIf `stdout` is an expression, the expression is evaluated and must\nreturn a string with the file name to use to capture stdout. If the\nreturn value is not a string, or the resulting path contains illegal\ncharacters (such as the path separator `/`) it is an error.\n"}, {'name': 'successCodes', 'type': ['null', {'type': 'array', 'items': 'int', 'name': ''}], 'doc': 'Exit codes that indicate the process completed successfully.\n'}, {'name': 'temporaryFailCodes', 'type': ['null', {'type': 'array', 'items': 'int', 'name': ''}], 'doc': 'Exit codes that indicate the process failed due to a possibly\ntemporary condition, where executing the process with the same\nruntime environment and inputs may produce different results.\n'}, {'name': 'permanentFailCodes', 'type': ['null', {'type': 'array', 'items': 'int', 'name': ''}], 'doc': 'Exit codes that indicate the process failed due to a permanent logic error, where executing the process with the same runtime environment and same inputs is expected to always fail.'}]}