ARM64-compatible Docker/Singularity images for bioinformatics and ML tools running on DGX Spark via Slurm.
1,000 SIF images built locally · 1,249 Dockerfiles defined · ARM64 (aarch64) (verified 2026-09-12 by direct file count; SIF count reflects this machine's local
sif/state, not a fixed platform-wide total)
The frontend (frontend/tool-images-ui/) lists every tool discovered from
dockerfiles/Dockerfile.* with its live build/SIF status — at the time of
this screenshot, 996 built, 2 needing a license, and 249 missing or broken
out of 1,247 tracked tools:
omnibioai-tool-images/
├── dockerfiles/ ← 1,249 Dockerfiles, one per tool
├── sandbox.def ← BioQueryAI Python sandbox def — see Notes
├── api/
│ └── server.py ← Build/status API — see "API" below
├── frontend/tool-images-ui/ ← React + TypeScript UI (Vite) — see "Frontend" below
├── sif/ ← built Singularity SIF images (gitignored)
├── build_logs/ ← build output logs (gitignored)
├── tests/ ← pytest test suite (coverage configured at 95% minimum)
├── scripts/
│ ├── build_all.sh ← build all images
│ ├── build_missing_sifs.sh ← rebuild only missing/failed SIFs
│ ├── build_new_tools.sh ← fallback builder for named tools
│ ├── build_multiarch_sifs.sh ← separate amd64+arm64 workflow
│ ├── push_to_hf.sh / push_to_ghcr.sh ← push SIFs to Hugging Face / GHCR
│ ├── upload_sifs_s3.sh / upload_sifs_azure.sh ← push SIFs to S3 / Azure Blob
│ └── archive/ ← superseded one-off build scripts (historical)
# Build a single tool
bash scripts/build_all.sh fastqc
# Build all tools
bash scripts/build_all.sh
# Build selected missing tools with the fallback builder
bash scripts/build_new_tools.sh tool_a tool_b
# Run tests
pytest tests/ -v -k "not test_tool_runs_in_sif"- Write
dockerfiles/Dockerfile.toolname - Run
bash scripts/build_all.sh toolname - Add tool entry to
omnibioai-tes/configs/tools/<domain>.yaml(edit the appropriate category file) - Run
make restartinomnibioai-tes— done!
Once SIFs are built, four scripts push them off this machine to a remote store. None of these are wired into the API — they're run manually, host-side:
| Script | Target | Requires |
|---|---|---|
scripts/push_to_hf.sh |
Hugging Face dataset repo omnibioai/omnibioai-sif-images |
huggingface-cli, logged in |
scripts/push_to_ghcr.sh |
ghcr.io/omnibioai/omnibioai-sif/<tool>:arm64 via oras (vendored in scripts/, auto-installed if missing) |
GH_USER and GH_TOKEN env vars |
scripts/upload_sifs_s3.sh |
s3://<S3_SIF_BUCKET>-<AWS account ID>/ (bucket auto-created) |
AWS CLI credentials |
scripts/upload_sifs_azure.sh |
Azure Blob container ${AZURE_SIF_CONTAINER:-omnibioai-sif} (auto-created) |
AZURE_STORAGE_CONNECTION_STRING |
All four skip files already present at the destination and are safe to
re-run. scripts/push_omnibioai_images.sh (the original combined
Sylabs+GHCR pusher) is superseded by these and kept only for history.
Tool configurations live in omnibioai-tes/configs/tools/ — one YAML file per domain.
Per-domain counts below sum to 1,007 and were not independently
re-verified in this pass — they may lag the 1,249 real Dockerfiles
and 1,000 built SIFs above; treat the per-domain breakdown as
directional, not exact.
| # | Domain | Config file | Tools | Examples |
|---|---|---|---|---|
| 01 | QC & Preprocessing | 01_qc_preprocessing.yaml |
35 | FastQC, MultiQC, Trimmomatic |
| 02 | Alignment | 02_alignment.yaml |
31 | BWA-MEM, BLASTN, Samtools |
| 03 | RNA-seq | 03_rnaseq.yaml |
58 | DESeq2, Kallisto, featureCounts |
| 04 | Variant Analysis | 04_variants.yaml |
57 | GATK, BCFtools, VEP |
| 05 | Epigenomics | 05_epigenomics.yaml |
36 | Bismark, MACS2, deepTools |
| 06 | Single-cell | 06_single_cell.yaml |
45 | Seurat, Scanpy, Cell Ranger |
| 07 | Spatial Omics | 07_spatial.yaml |
11 | Cellpose, Space Ranger, Squidpy |
| 08 | Assembly | 08_assembly.yaml |
20 | SPAdes, Flye, QUAST |
| 09 | Metagenomics | 09_metagenomics.yaml |
30 | Kraken2, MetaPhlAn, HUMAnN3 |
| 10 | Microbiome | 10_microbiome.yaml |
18 | QIIME2, nf-core Ampliseq |
| 11 | Population Genetics | 11_population_genetics.yaml |
29 | ADMIXTURE, GCTA, REGENIE |
| 12 | Structural Biology | 12_structural_biology.yaml |
27 | AlphaFold2, AutoDock, ESM-2 |
| 13 | Immunogenomics | 13_immunogenomics.yaml |
6 | MiXCR, TRUST4, arcasHLA |
| 14 | Ancient DNA | 14_ancient_dna.yaml |
1 | EAGER2 |
| 15 | Metabolomics | 15_metabolomics.yaml |
5 | XCMS, MZmine3, SIRIUS |
| 16 | Drug Discovery | 16_drug_discovery.yaml |
1 | ADMET Prediction |
| 17 | Proteomics | 17_proteomics.yaml |
14 | MSFragger, Percolator, Philosopher |
| 18 | ML / DL | 18_ml_dl.yaml |
19 | PyTorch, TensorFlow, RAPIDS |
| 19 | Cancer Genomics | 19_cancer_genomics.yaml |
10 | AMBER, COBALT, Survival KM |
| 20 | Comparative Genomics | 20_comparative_genomics.yaml |
8 | OrthoFinder, MCScan |
| 21 | Multi-omics | 21_multiomics.yaml |
4 | MOFA+, MOSCOT |
| 22 | Proteogenomics | 22_proteogenomics.yaml |
4 | TransDecoder, PRICE, Xtail |
| 23 | nf-core Pipelines | 23_nfcore_pipelines.yaml |
2 | nf-core RNA-seq, Nanoseq |
| 24 | Annotation | 24_annotation.yaml |
4 | RepeatMasker, AUGUSTUS, DAVID |
| 25 | Genomic Utilities | 25_genomic_utilities.yaml |
3 | BEDTools, BEDOPS, PyMOL |
| 26 | Long Read | 26_longread.yaml |
6 | Guppy, Dorado, Medaka |
| 27 | CRISPR | 27_crispr.yaml |
9 | MAGeCK, Cas-OFFinder |
| 28 | Imaging | 28_imaging.yaml |
2 | Steinbock, MCMICRO |
| 29 | HTTP Tools | 29_http_tools.yaml |
512 | Enrichr, OmniBioAI Workflow Runner |
# Run all tests (excluding live SIF execution)
pytest tests/ -v -k "not test_tool_runs_in_sif"
# Run with coverage
pytest tests/ --cov=scripts --cov-report=term-missing \
-k "not test_tool_runs_in_sif"
# Run including SIF execution tests (requires Singularity)
pytest tests/ -vTest result (verified 2026-09-12): 11,545 passed · 1 skipped · 24 deselected
in 32s (excludes live SIF-execution tests). This is a clean run — the
previously reported 1,525 failures (all one category,
test_dockerfiles.py::TestDockerfileStructure::test_dockerfile_uses_approved_base)
were fixed in commit 5d85eb2 ("update Dockerfile contract checks").
api/server.py (FastAPI) serves as the tool-images container in
omnibioai-studio's compose stack, port 8097.
| Method | Endpoint | Status |
|---|---|---|
| GET | /health |
Working |
| GET | /v1/tools |
Working — lists tools discovered from dockerfiles/Dockerfile.* |
| GET | /v1/tools/{tool}/dockerfile |
Working — returns the raw Dockerfile |
| GET | /v1/tools/{tool}/log |
Working — returns the build log if one exists |
| POST | /v1/build/{tool} |
Known non-functional (documented in code, issue #13, closed won't-fix) |
| POST | /v1/build-all |
Known non-functional (same reason) |
The two build endpoints shell out to scripts/build_all.sh, but the container
this API runs in only has api/ copied into it — no Docker CLI, no
/var/run/docker.sock, no Singularity/Apptainer binary, and
scripts/build_all.sh itself isn't even present in the image. They're left in
place returning exit 127 rather than reworked into something that looks
functional but isn't. The real build path is host-side:
scripts/build_missing_sifs.sh (or scripts/build_all.sh directly), run on a host with
Docker + Singularity installed — never through this HTTP API.
The API container exposes two ports in the Compose deployment:
8097— FastAPI API (/health,/v1/*, and/docs)5179— nginx-served React frontend, proxying/v1/*to the API
The standalone Docker image copies the API and frontend only. Compose mounts
the host dockerfiles/, sif/, and build_logs/ directories into the
container so the UI can inspect the current host-side build state.
frontend/tool-images-ui/ (React + TypeScript, Vite) — ships in this
same repo, not documented elsewhere.
cd frontend/tool-images-ui
npm install
npm run devThe production frontend is served by nginx on port 5179. The Vite development server uses its own development port and is useful when working on the UI independently of the Compose container.
- All images are built for
linux/arm64(aarch64) — DGX Spark / Grace Hopper scripts/build_all.sh,scripts/build_missing_sifs.sh, and the fallback builders are ARM64 workflows;scripts/build_multiarch_sifs.shis the separate workflow for its explicitly selectedamd64+arm64tool set- SIF files are stored in
sif/(gitignored — ~235G total) - Tools marked
⚠️ require an external license or manual download - Tools reusing an existing SIF are noted as
reused - Build logs are in
build_logs/(gitignored) sandbox.defis a separate, manually-built Apptainer definition (not part of thedockerfiles/+scripts/build_all.shpipeline) that producessif/bioqueryai_sandbox.sif— a general-purpose Python analysis sandbox (pandas/scanpy/pydeseq2/etc.). It's consumed outside this repo:omnibioai-tes(tool_id: bioqueryai_python_runner/bioqueryai_sandbox_script) andomnibioai-workbench's BioQueryAI agent run LLM-generated Python scripts inside it viaapptainer exec --writable-tmpfs, over Slurm/TES.
For host-side image/SIF builds, install:
- Python 3.11 or newer
- Docker with BuildKit/buildx support
- Singularity or Apptainer
- Sufficient local storage for Docker layers, build logs, and SIF images
For the frontend, use Node.js/npm. The API container installs its Python
runtime dependencies during the Docker build; host-side test execution uses
the dependencies in requirements-test.txt and the coverage configuration
in pyproject.toml.
| Repo | Description |
|---|---|
omnibioai-tes |
Tool Execution Service — orchestrates Slurm jobs |
omnibioai-tool-runtime |
Containerized tool runner |
omnibioai |
Main Django application |
omnibioai-toolserver |
HTTP ToolServer shim |
