pontus
08/18/2026, 6:10 AMarm.config or similar with alternate container definitions (new URLs) but rather rely on wave and have the strategy prefer conda builds. That generally makes it easy enough if that's the case.
Can anyone confirm that's not a misunderstanding?pontus
08/18/2026, 6:13 AMpontus
08/18/2026, 6:19 AMwave.freeze really does, or rather if there's any risk of it being "undone" so that wave would trigger a new build for a environment.yml it has previously built a container for?
I'm thinking about whatever wave generated containers can be used in a way that allows them to be considered tested and verified.pontus
08/18/2026, 6:25 AMPhil Ewels
08/18/2026, 6:47 AMPhil Ewels
08/18/2026, 6:49 AMwe no longer have anNo, this is incorrect. We will use Wave to build 2x containers for every package: one arm, one x86. We also keep the conda lockfiles for reproducible conda environments to avoid drift (the old conda environment.yml is still there but you have to ask for it specifically in a new profile name)or similar with alternate container definitions (new URLs) but rather rely on wave and have the strategy prefer conda builds.arm.config
Phil Ewels
08/18/2026, 6:50 AMproprietary/non-free softwareI'm not really clear on how the containerisation or arm64 fits into this? For nf-core if there is software like this that is needed, we usually say you need to BYO container / conda environment.
Phil Ewels
08/18/2026, 6:57 AMwave.freeze
Basically this tells Wave to push the container to the specified OCI registry when the build is complete (if none specified, that is the Seqera Containers registry: commuity.wave.seqera.io )
Wave knows the hash of the request that was made for the container, so if another request comes in with the same hash it'll then just redirect directly to the previously built image rather than rebuilding
New builds can be triggered if the image is deleted from the registry (Seqera Containers public registry never does this, we commit to keeping images for at least 5 years), or if something causes the cache key to change.
For us the main thing that makes this likely is if the build Dockerfile changes. When you request a build with conda packages it uses a template Dockerfile. For nf-core I think we are supplying our own now (?) but also the default can change if we want to update or change something (eg. update miniconda, use pixi instead, whatever). Doing this then invalidates the hash for future requests for the same conda packages.Phil Ewels
08/18/2026, 6:57 AMoffline supportWave is fundamentally a remote service, so if you want to request an image from conda packages you need to be able to make a connection to Wave. This is one of the main drivers for nf-core to use Wave only on the automated build side and not just bundle it directly into nf-core pipelines (which would be a hell of a lot simpler 😆 ). So for nf-core, when a new module turns up we request images from Wave / Seqera Containers in the CI. We then take the resulting docker URIs and save those into the config files. This means that the pipelines get big config files directly listing the container URIs without wave, which allows all of the usual "download for offline use" machinery to work as usual - Nextflow doesn't need to work out the container URI at run time, which means that it can check a local path for the image.
Phil Ewels
08/18/2026, 6:58 AMI'm thinking about whatever wave generated containers can be used in a way that allows them to be considered tested and verified.See above. Wave is dynamic by design (that's kind of its main feature), so if you want them to be static for "verified" status of some kind, you need to use it only at build time and not run time.
Phil Ewels
08/18/2026, 7:00 AMPhil Ewels
08/18/2026, 7:01 AMPhil Ewels
08/18/2026, 7:02 AMPhil Ewels
08/18/2026, 7:02 AM#wave-containers channel for all things WavePhil Ewels
08/18/2026, 7:03 AM#wave that flags posts to our internal Seqera slack Wave team 🤫 wave containersPhil Ewels
08/18/2026, 7:03 AMpontus
08/18/2026, 7:03 AMPhil Ewels
08/18/2026, 7:04 AMpontus
08/18/2026, 7:05 AMincludeConfig for container config files.pontus
08/18/2026, 7:07 AMarm64 (in tools templates) profile sets wave.strategy = 'conda,container' (along with wave.enabled et.c.) which I would have thought would mean it preferred requesting a image from wave rather than use the one from the container directive. Is that profile obsolete and something that's picked up automatically somehow?pontus
08/18/2026, 7:09 AMPhil Ewels
08/18/2026, 7:16 AMYes, this is because we haven't finished migrating to Seqera Containers yet. #C09V4RAHV0X is still in mid-flight so for now we don't yet have pinned arm64 containers for all modules. The above wave config is a stop-gap until we do (if we didn't need offline containers etc then these two lines of config is basically all we'd need, which is what I meant by it being "a lot simpler" 😅 )wave.strategy
Phil Ewels
08/18/2026, 7:17 AMPhil Ewels
08/18/2026, 7:19 AMPhil Ewels
08/18/2026, 7:20 AMpontus
08/18/2026, 7:32 AMPhil Ewels
08/18/2026, 7:33 AMPhil Ewels
08/18/2026, 7:34 AMmeta.yml
• Pipeline dev time
◦ On pulling in new modules, #CE5LG7WMB will record URIs in auto-generated pipeline config files
• Pipeline run time
◦ On run, configs will point to containers for each process, depending on the profile used (CPU arch + container enginer)pontus
08/18/2026, 7:35 AMPhil Ewels
08/18/2026, 7:36 AMpontus
08/18/2026, 7:37 AMPhil Ewels
08/18/2026, 7:37 AMpontus
08/18/2026, 7:37 AMPhil Ewels
08/18/2026, 7:38 AMPhil Ewels
08/18/2026, 7:38 AMprocess.arch)Phil Ewels
08/18/2026, 7:39 AMpontus
08/18/2026, 7:40 AMpontus
08/18/2026, 7:40 AMprocess.arch would need to be dealt with to provide the right answer, but it doesn't seem like it will help here.)Phil Ewels
08/18/2026, 7:42 AMsbatch submission, how would you know which container to give the script?Phil Ewels
08/18/2026, 7:42 AMpontus
08/18/2026, 7:45 AMimages/$(uname -m)/myimage.sif that would be evaluated at runtime.Phil Ewels
08/18/2026, 7:47 AMpontus
08/18/2026, 7:48 AMpontus
08/18/2026, 7:50 AMoras can differ based on the architecture used when fetching. That would be confusing at least, so not something I'd want.pontus
08/18/2026, 7:57 AMaccelerator set to something other than 0/null) and write out a config that the user can run with and point the containers for those processes to the correct ones for their respective architectures.Phil Ewels
08/18/2026, 7:58 AMPhil Ewels
08/18/2026, 7:59 AMcontainer strings that are selected according to what arch is. Then we would only need to toggle process.arch and the rest of the config would sort itself out. Pretty sure I've suggested that before years ago and got no-where though. I might take another poke at it.Phil Ewels
08/18/2026, 8:00 AMpontus
08/18/2026, 8:01 AMarch is rather straightforward for my case considered here, so it would mostly come down to evaluation order.pontus
08/18/2026, 8:02 AMcontainer would be nice.Phil Ewels
08/18/2026, 8:03 AMprocess.arch = { task.accelerator == "something" ? 'x86' : 'arm64' } you mean? (pseudocode) Yeah that would be nice.pontus
08/18/2026, 8:03 AMPhil Ewels
08/18/2026, 8:43 AMOops, I was wrong sorry. Paolo added it back in March: github.com/seqeralabs/wave/pull/985Right, yes as it stands Wave is not able to make multi-arch container manifests
pontus
08/18/2026, 8:49 AMPhil Ewels
08/18/2026, 8:54 AMPhil Ewels
08/18/2026, 8:54 AMPhil Ewels
08/18/2026, 8:44 PMprocess.container can already take a deferred gstring, right? I mean the old style we use already has a conditional:
container "${ workflow.containerEngine == 'singularity' && !task.ext.singularity_pull_docker_container ?
'<https://depot.galaxyproject.org/singularity/ubuntu:20.04>' :
'nf-core/ubuntu:20.04' }"
Could you not use the same trick here?Phil Ewels
08/18/2026, 8:45 PMPhil Ewels
08/18/2026, 8:46 PMprocess.arch can now take multiple arguments: process.arch = 'linux/amd64,linux/arm64'Phil Ewels
08/18/2026, 8:46 PMpontus
08/19/2026, 6:34 AMpontus
08/19/2026, 7:07 AMprocess.arch allowing for multi-values, I don't think I see the benefit of that for now (but that doesn't mean there isn't one).Phil Ewels
08/19/2026, 7:08 AMpontus
08/19/2026, 7:11 AMPhil Ewels
08/19/2026, 7:14 AMPhil Ewels
08/19/2026, 7:14 AMpontus
08/19/2026, 7:17 AMPhil Ewels
08/19/2026, 7:55 AMPhil Ewels
08/19/2026, 7:56 AMpontus
09/14/2026, 7:47 AM