Skip to content

Apptainer: Cannot invoke "nextflow.util.Duration.toMillis()" because "this.pullTimeout" is null #6517

@JulienRaynal

Description

@JulienRaynal

Bug report

(Please follow this template by replacing the text between parentheses with the requested information)

Expected behavior and actual behavior

  • Expected behaviour: The nextflow pipelines pulls the container using the default parameter apptainer.pullTimeout and runs correctly.
    Documentation: The amount of time the Apptainer pull can last, exceeding which the process is terminated (default: 20 min). (https://www.nextflow.io/docs/stable/reference/config.html#config-apptainer)

  • Actual behaviour: The nextflow pipeline crashes with the following message Caused by: Cannot invoke "nextflow.util.Duration.toMillis()" because "this.pullTimeout" is null

Steps to reproduce the problem

main.nf

process hello {
        container "community.wave.seqera.io/library/bcftools:1.2--90c7b6fdb96e230f"

        output:
        path("hello.txt"), emit: text

        script:
        """
        echo "hello" > hello.txt
        """
}

workflow {
        file = hello()
}

nextflow.config

apptainer {
	enabled = true
	cacheDir = "work/singularity/"
}

command

nextflow run main.nf -c nextflow.config

Program output

 N E X T F L O W   ~  version 25.10.0

Launching `main.nf` [drunk_fourier] DSL2 - revision: 3c3f6a6691

Pulling Apptainer image docker://community.wave.seqera.io/library/bcftools:1.2--90c7b6fdb96e230f [cache /Users/user/DPulling Apptainer image docker://community.wave.seqera.io/library/bcftools:1.2--90c7b6fdb96e230f [cache /Users/user/nextflow/failure/work/singularity/community.wave.seqera.io-library-bcftools-1.2--90c7b6fdb96e230f.img]
ERROR ~ Error executing process > 'hello'

Caused by:
  Cannot invoke "nextflow.util.Duration.toMillis()" because "this.pullTimeout" is null



 -- Check '.nextflow.log' file for details
Oct-28 11:03:23.724 [main] DEBUG nextflow.cli.Launcher - $> nextflow -c nextflow.config run main.nf
Oct-28 11:03:23.757 [main] DEBUG nextflow.cli.CmdRun - N E X T F L O W  ~  version 25.10.0
Oct-28 11:03:24.236 [main] DEBUG nextflow.config.ConfigBuilder - Found config local: /Users/user/nextflow/failure/nextflow.config
Oct-28 11:03:24.238 [main] DEBUG nextflow.config.ConfigBuilder - User config file: /Users/user/nextflow/failure/nextflow.config
Oct-28 11:03:24.239 [main] DEBUG nextflow.config.ConfigBuilder - Parsing config file: /Users/user/nextflow/failure/nextflow.config
Oct-28 11:03:24.239 [main] DEBUG nextflow.config.ConfigBuilder - Parsing config file: /Users/user/nextflow/failure/nextflow.config
Oct-28 11:03:24.253 [main] DEBUG nextflow.config.ConfigBuilder - Applying config profile: `standard`
Oct-28 11:03:24.441 [main] DEBUG nextflow.config.ConfigBuilder - Applying config profile: `standard`
Oct-28 11:03:24.463 [main] DEBUG nextflow.plugin.PluginsFacade - Setting up plugin manager > mode=prod; embedded=false; plugins-dir=/Users/user/.nextflow/plugins; core-plugins: nf-amazon@3.4.1,nf-azure@1.20.2,nf-cloudcache@0.5.0,nf-codecommit@0.5.0,nf-console@1.3.0,nf-google@1.23.3,nf-k8s@1.2.2,nf-tower@1.17.1,nf-wave@1.16.1
Oct-28 11:03:24.471 [main] INFO  o.pf4j.DefaultPluginStatusProvider - Enabled plugins: []
Oct-28 11:03:24.472 [main] INFO  o.pf4j.DefaultPluginStatusProvider - Disabled plugins: []
Oct-28 11:03:24.473 [main] INFO  org.pf4j.DefaultPluginManager - PF4J version 3.12.0 in 'deployment' mode
Oct-28 11:03:24.483 [main] DEBUG nextflow.util.RetryConfig - Missing nextflow session - using default retry config
Oct-28 11:03:24.574 [main] INFO  org.pf4j.AbstractPluginManager - No plugins
Oct-28 11:03:24.574 [main] DEBUG nextflow.plugin.PluginsFacade - Plugins default=[]
Oct-28 11:03:24.574 [main] DEBUG nextflow.plugin.PluginsFacade - Plugins resolved requirement=[]
Oct-28 11:03:24.584 [main] DEBUG n.secret.LocalSecretsProvider - Secrets store: /Users/user/.nextflow/secrets/store.json
Oct-28 11:03:24.586 [main] DEBUG nextflow.secret.SecretsLoader - Discovered secrets providers: [nextflow.secret.LocalSecretsProvider@6aa3bfc] - activable => nextflow.secret.LocalSecretsProvider@6aa3bfc
Oct-28 11:03:24.591 [main] DEBUG nextflow.cli.CmdRun - Applied DSL=2 by global default
Oct-28 11:03:24.598 [main] DEBUG nextflow.cli.CmdRun - Launching `main.nf` [drunk_fourier] DSL2 - revision: 3c3f6a6691
Oct-28 11:03:24.623 [main] DEBUG nextflow.Session - Session UUID: 5cd61535-fdb9-49f4-9f35-d4ad1d420573
Oct-28 11:03:24.623 [main] DEBUG nextflow.Session - Run name: drunk_fourier
Oct-28 11:03:24.623 [main] DEBUG nextflow.Session - Executor pool size: 12
Oct-28 11:03:24.628 [main] DEBUG nextflow.file.FilePorter - File porter settings maxRetries=3; maxTransfers=50; pollTimeout=null
Oct-28 11:03:24.630 [main] DEBUG nextflow.util.ThreadPoolBuilder - Creating thread pool 'FileTransfer' minSize=10; maxSize=36; workQueue=LinkedBlockingQueue[-1]; allowCoreThreadTimeout=false
Oct-28 11:03:25.086 [main] DEBUG nextflow.cli.CmdRun - 
  Version: 25.10.0 build 10289
  Created: 22-10-2025 16:26 UTC (18:26 CEST)
  System: Mac OS X 26.0.1
  Runtime: Groovy 4.0.28 on OpenJDK 64-Bit Server VM 23.0.2+7
  Encoding: UTF-8 (UTF-8)
  Process: 3684@users-MacBook-Pro.local [127.0.0.1]
  CPUs: 12 - Mem: 36 GB (14.7 GB) - Swap: 0 (0)
Oct-28 11:03:25.100 [main] DEBUG nextflow.Session - Work-dir: /Users/user/nextflow/failure/work [Mac OS X]
Oct-28 11:03:25.100 [main] DEBUG nextflow.Session - Script base path does not exist or is not a directory: /Users/user/nextflow/failure/bin
Oct-28 11:03:25.107 [main] DEBUG nextflow.executor.ExecutorFactory - Extension executors providers=[]
Oct-28 11:03:25.112 [main] DEBUG nextflow.Session - Observer factory (v2): LinObserverFactory
Oct-28 11:03:25.113 [main] DEBUG nextflow.Session - Observer factory (v2): DefaultObserverFactory
Oct-28 11:03:25.130 [main] DEBUG nextflow.cache.CacheFactory - Using Nextflow cache factory: nextflow.cache.DefaultCacheFactory
Oct-28 11:03:25.135 [main] DEBUG nextflow.util.CustomThreadPool - Creating default thread pool > poolSize: 13; maxThreads: 1000
Oct-28 11:03:25.163 [main] DEBUG nextflow.Session - Session start
Oct-28 11:03:25.248 [main] DEBUG nextflow.script.ScriptRunner - > Launching execution
Oct-28 11:03:25.285 [main] DEBUG nextflow.executor.ExecutorFactory - << taskConfig executor: null
Oct-28 11:03:25.285 [main] DEBUG nextflow.executor.ExecutorFactory - >> processorType: 'local'
Oct-28 11:03:25.290 [main] DEBUG nextflow.executor.Executor - [warm up] executor > local
Oct-28 11:03:25.293 [main] DEBUG n.processor.LocalPollingMonitor - Creating local task monitor for executor 'local' > cpus=12; memory=36 GB; capacity=12; pollInterval=100ms; dumpInterval=5m
Oct-28 11:03:25.294 [main] DEBUG n.processor.TaskPollingMonitor - >>> barrier register (monitor: local)
Oct-28 11:03:25.304 [main] DEBUG nextflow.processor.TaskProcessor - Creating process 'hello': maxForks=0; fair=false; array=0
Oct-28 11:03:25.324 [main] DEBUG nextflow.Session - Workflow process names [dsl2]: hello
Oct-28 11:03:25.325 [main] DEBUG nextflow.Session - Igniting dataflow network (1)
Oct-28 11:03:25.325 [main] DEBUG nextflow.processor.TaskProcessor - Starting process > hello
Oct-28 11:03:25.325 [main] DEBUG nextflow.script.ScriptRunner - Parsed script files:
  Script_1ff0da7547f92f24: /Users/user/nextflow/failure/main.nf
Oct-28 11:03:25.325 [main] DEBUG nextflow.script.ScriptRunner - > Awaiting termination 
Oct-28 11:03:25.325 [main] DEBUG nextflow.Session - Session await
Oct-28 11:03:25.362 [Actor Thread 5] INFO  nextflow.container.SingularityCache - Pulling Apptainer image docker://community.wave.seqera.io/library/bcftools:1.2--90c7b6fdb96e230f [cache /Users/user/nextflow/failure/work/singularity/community.wave.seqera.io-library-bcftools-1.2--90c7b6fdb96e230f.img]
Oct-28 11:03:25.365 [Actor Thread 3] DEBUG nextflow.processor.TaskProcessor - Handling unexpected condition for
  task: name=hello; work-dir=null
  error [java.lang.IllegalStateException]: java.lang.NullPointerException: Cannot invoke "nextflow.util.Duration.toMillis()" because "this.pullTimeout" is null
Oct-28 11:03:25.369 [Actor Thread 3] ERROR nextflow.processor.TaskProcessor - Error executing process > 'hello'

Caused by:
  Cannot invoke "nextflow.util.Duration.toMillis()" because "this.pullTimeout" is null


java.lang.IllegalStateException: java.lang.NullPointerException: Cannot invoke "nextflow.util.Duration.toMillis()" because "this.pullTimeout" is null
	at nextflow.container.SingularityCache.getCachePathFor(SingularityCache.groovy:354)
	at nextflow.container.ContainerHandler.createApptainerCache(ContainerHandler.groovy:110)
	at nextflow.container.ContainerHandler.normalizeImageName(ContainerHandler.groovy:84)
	at nextflow.container.resolver.DefaultContainerResolver.resolveImage0(DefaultContainerResolver.groovy:68)
	at nextflow.container.resolver.DefaultContainerResolver.resolveImage(DefaultContainerResolver.groovy:61)
	at org.codehaus.groovy.vmplugin.v8.IndyInterface.fromCache(IndyInterface.java:321)
	at nextflow.processor.TaskRun.containerInfo0(TaskRun.groovy:722)
	at java.base/jdk.internal.reflect.DirectMethodHandleAccessor.invoke(DirectMethodHandleAccessor.java:103)
	at java.base/java.lang.reflect.Method.invoke(Method.java:580)
	at org.codehaus.groovy.reflection.CachedMethod.invoke(CachedMethod.java:343)
	at groovy.lang.MetaMethod.doMethodInvoke(MetaMethod.java:328)
	at groovy.lang.MetaClassImpl.doInvokeMethod(MetaClassImpl.java:1339)
	at groovy.lang.MetaClassImpl.invokeMethod(MetaClassImpl.java:1094)
	at org.codehaus.groovy.runtime.ScriptBytecodeAdapter.invokeMethodOnCurrentN(ScriptBytecodeAdapter.java:97)
	at nextflow.processor.TaskRun.this$dist$invoke$1(TaskRun.groovy)
	at nextflow.processor.TaskRun$3.methodMissing(TaskRun.groovy)
	at java.base/jdk.internal.reflect.DirectMethodHandleAccessor.invoke(DirectMethodHandleAccessor.java:103)
	at java.base/java.lang.reflect.Method.invoke(Method.java:580)
	at org.codehaus.groovy.reflection.CachedMethod.invoke(CachedMethod.java:343)
	at groovy.lang.MetaClassImpl.invokeMissingMethod(MetaClassImpl.java:924)
	at groovy.lang.MetaClassImpl.invokePropertyOrMissing(MetaClassImpl.java:1419)
	at groovy.lang.MetaClassImpl.doInvokeMethod(MetaClassImpl.java:1341)
	at groovy.lang.MetaClassImpl.invokeMethod(MetaClassImpl.java:1094)
	at groovy.lang.MetaClassImpl.invokeMethod(MetaClassImpl.java:1007)
	at org.codehaus.groovy.vmplugin.v8.IndyInterface.fromCache(IndyInterface.java:321)
	at nextflow.processor.TaskRun$3.apply(TaskRun.groovy:703)
	at nextflow.processor.TaskRun$3.apply(TaskRun.groovy)
	at java.base/java.util.concurrent.ConcurrentHashMap.computeIfAbsent(ConcurrentHashMap.java:1713)
	at org.codehaus.groovy.vmplugin.v8.IndyInterface.fromCache(IndyInterface.java:321)
	at nextflow.processor.TaskRun.containerInfo(TaskRun.groovy:700)
	at org.codehaus.groovy.vmplugin.v8.IndyInterface.fromCache(IndyInterface.java:321)
	at nextflow.processor.TaskRun.getContainer(TaskRun.groovy:734)
	at org.codehaus.groovy.vmplugin.v8.IndyInterface.fromCache(IndyInterface.java:321)
	at nextflow.processor.TaskRun.isContainerEnabled(TaskRun.groovy:800)
	at org.codehaus.groovy.vmplugin.v8.IndyInterface.fromCache(IndyInterface.java:321)
	at nextflow.processor.TaskProcessor.createTaskHashKey(TaskProcessor.groovy:2031)
	at org.codehaus.groovy.vmplugin.v8.IndyInterface.fromCache(IndyInterface.java:321)
	at nextflow.processor.TaskProcessor.invokeTask(TaskProcessor.groovy:687)
	at nextflow.processor.InvokeTaskAdapter.call(InvokeTaskAdapter.groovy:52)
	at groovyx.gpars.dataflow.operator.DataflowOperatorActor.startTask(DataflowOperatorActor.java:120)
	at groovyx.gpars.dataflow.operator.ForkingDataflowOperatorActor.access$001(ForkingDataflowOperatorActor.java:35)
	at groovyx.gpars.dataflow.operator.ForkingDataflowOperatorActor$1.run(ForkingDataflowOperatorActor.java:58)
	at java.base/java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1144)
	at java.base/java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:642)
	at java.base/java.lang.Thread.run(Thread.java:1575)
Caused by: java.lang.NullPointerException: Cannot invoke "nextflow.util.Duration.toMillis()" because "this.pullTimeout" is null
	at nextflow.container.SingularityCache.runCommand(SingularityCache.groovy:292)
	at nextflow.container.SingularityCache.downloadContainerImage0(SingularityCache.groovy:273)
	at java.base/jdk.internal.reflect.DirectMethodHandleAccessor.invoke(DirectMethodHandleAccessor.java:103)
	at java.base/java.lang.reflect.Method.invoke(Method.java:580)
	at org.codehaus.groovy.reflection.CachedMethod.invoke(CachedMethod.java:343)
	at groovy.lang.MetaMethod.doMethodInvoke(MetaMethod.java:328)
	at groovy.lang.MetaClassImpl.doInvokeMethod(MetaClassImpl.java:1339)
	at groovy.lang.MetaClassImpl.invokeMethod(MetaClassImpl.java:1094)
	at groovy.lang.MetaClassImpl.invokeMethod(MetaClassImpl.java:1007)
	at org.codehaus.groovy.runtime.InvokerHelper.invokePogoMethod(InvokerHelper.java:645)
	at org.codehaus.groovy.runtime.InvokerHelper.invokeMethod(InvokerHelper.java:628)
	at org.codehaus.groovy.runtime.InvokerHelper.invokeMethodSafe(InvokerHelper.java:82)
	at nextflow.container.SingularityCache$_downloadContainerImage_closure1.doCall(SingularityCache.groovy:241)
	at nextflow.container.SingularityCache$_downloadContainerImage_closure1.call(SingularityCache.groovy)
	at nextflow.file.FileMutex.lock(FileMutex.groovy:106)
	at nextflow.container.SingularityCache.downloadContainerImage(SingularityCache.groovy:241)
	at java.base/jdk.internal.reflect.DirectMethodHandleAccessor.invoke(DirectMethodHandleAccessor.java:103)
	at java.base/java.lang.reflect.Method.invoke(Method.java:580)
	at org.codehaus.groovy.reflection.CachedMethod.invoke(CachedMethod.java:343)
	at groovy.lang.MetaMethod.doMethodInvoke(MetaMethod.java:328)
	at groovy.lang.MetaClassImpl.doInvokeMethod(MetaClassImpl.java:1339)
	at groovy.lang.MetaClassImpl.invokeMethod(MetaClassImpl.java:1094)
	at groovy.lang.MetaClassImpl.invokeMethod(MetaClassImpl.java:1007)
	at org.codehaus.groovy.runtime.InvokerHelper.invokePogoMethod(InvokerHelper.java:645)
	at org.codehaus.groovy.runtime.InvokerHelper.invokeMethod(InvokerHelper.java:628)
	at org.codehaus.groovy.runtime.InvokerHelper.invokeMethodSafe(InvokerHelper.java:82)
	at nextflow.container.SingularityCache$_getLazyImagePath_closure2.doCall(SingularityCache.groovy:331)
	at nextflow.container.SingularityCache$_getLazyImagePath_closure2.call(SingularityCache.groovy)
	at groovyx.gpars.dataflow.LazyDataflowVariable$1.run(LazyDataflowVariable.java:70)
	... 3 common frames omitted
Oct-28 11:03:25.371 [Actor Thread 3] DEBUG nextflow.Session - Session aborted -- Cause: java.lang.NullPointerException: Cannot invoke "nextflow.util.Duration.toMillis()" because "this.pullTimeout" is null
Oct-28 11:03:25.377 [Actor Thread 3] DEBUG nextflow.Session - The following nodes are still active:
[process] hello
  status=ACTIVE
  port 0: (cntrl) -     ; channel: $

Oct-28 11:03:25.382 [Actor Thread 3] DEBUG n.trace.WorkflowStatsObserver - Workflow completed > WorkflowStats[succeededCount=0; failedCount=0; ignoredCount=0; cachedCount=0; pendingCount=0; submittedCount=0; runningCount=0; retriesCount=0; abortedCount=0; succeedDuration=0ms; failedDuration=0ms; cachedDuration=0ms;loadCpus=0; loadMemory=0; peakRunning=0; peakCpus=0; peakMemory=0; ]
Oct-28 11:03:25.400 [Task monitor] DEBUG n.processor.TaskPollingMonitor - <<< barrier arrives (monitor: local) - terminating tasks monitor poll loop
Oct-28 11:03:25.587 [main] DEBUG nextflow.Session - Session await > all processes finished
Oct-28 11:03:25.587 [main] DEBUG nextflow.Session - Session await > all barriers passed
Oct-28 11:03:25.588 [main] DEBUG n.trace.WorkflowStatsObserver - Workflow completed > WorkflowStats[succeededCount=0; failedCount=0; ignoredCount=0; cachedCount=0; pendingCount=0; submittedCount=0; runningCount=0; retriesCount=0; abortedCount=0; succeedDuration=0ms; failedDuration=0ms; cachedDuration=0ms;loadCpus=0; loadMemory=0; peakRunning=0; peakCpus=0; peakMemory=0; ]
Oct-28 11:03:25.590 [Actor Thread 1] DEBUG nextflow.processor.TaskProcessor - Handling unexpected condition for
  task: name=hello; work-dir=null
  error [java.lang.InterruptedException]: java.lang.InterruptedException
Oct-28 11:03:25.596 [main] DEBUG nextflow.cache.CacheDB - Closing CacheDB done
Oct-28 11:03:25.607 [main] DEBUG nextflow.script.ScriptRunner - > Execution complete -- Goodbye

Environment

  • Nextflow version: 25.10.0
  • Java version: openjdk 23.0.2 2025-01-21
  • Operating system: [macOS and Linux]
  • Bash version: zsh 5.9 (arm64-apple-darwin25.0) and GNU bash, version 5.2.21(1)-release (x86_64-pc-linux-gnu)

Additional context

apptainer version 1.4.0

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions