High-performance, multi-architecture Docker distribution of the full QSV data-wrangling toolkit.
405
High-performance, multi-architecture (linux/amd64 and linux/arm64) Docker distribution of QSV, the blazing-fast tabular data-wrangling toolkit. This image serves as the foundational binary provider across the entire Data Artifex Docker ecosystem.
Upstream QSV distributes official precompiled binaries on GitHub Releases (qsv-*-unknown-linux-gnu.zip and musl.zip). However, users running Linux—especially on 64-bit ARM (aarch64 / ARM64) or environments requiring statically linked musl binaries (such as Alpine Linux, containerized pipelines, or minimal root filesystems)—quickly discover that the official Linux binaries have a significantly reduced feature set.
The official prebuilt binaries for aarch64-unknown-linux-musl, x86_64-unknown-linux-musl, and aarch64-unknown-linux-gnu intentionally omit major computational commands:
sqlp & joinp (Vectorized SQL queries and joins powered by Polars)luau (High-speed embedded scripting engine)to (High-speed conversion to Parquet, Excel XLSX, ODS, and SQLite)readstat (Native parsing of SPSS, SAS, and Stata files)geocode & geoconvert (Forward and reverse geocoding)viz (Plotly data visualization and auto-dashboards)The upstream omission of these features is not a design preference, but a technical compromise dictated by CI/CD cross-compilation infrastructure:
Luau JIT Cache Invalidation on ARM64 Musl (__clear_cache):
__clear_cache.__clear_cache is provided by the C runtime. On Musl libc on ARM64, __clear_cache is supplied by libgcc, not Musl.-C link-arg=-lgcc), compiling Luau with Musl on ARM64 fails during link time with unresolved symbol errors. In GitHub Actions automated multi-target matrices, this causes build failures, leading upstream to disable luau on Linux Musl targets.Polars & Arrow Memory Exhaustion in GitHub Actions:
polars-core, polars-sql, polars-arrow) is heavily templated. Compiling Polars with optimizations requires substantial memory (often 8–16+ GB of RAM) and extensive CPU time.signal: 9, SIGKILL) or exceeds GitHub's job execution limits.C/C++ Native Dependencies & Toolchain Fragility:
readstat (wrapping C libraries for SAS/SPSS/Stata), to (format conversions via csvs_convert and spreadsheet-ods), and geocode (bundling spatial indexing trees) rely on native C/C++ compilation via build.rs.cross / musl-tools) that are prone to CI breakages.Allocator Incompatibilities on ARM64 Musl:
tikv-jemallocator (the high-performance memory allocator utilized by QSV on macOS and x86_64 Linux) does not build cleanly with the native ARM64 Musl toolchain on standard CI runners, forcing upstream Musl artifacts to omit jemalloc and feature-gated bundles (qsvdp, qsvmcp).To ensure CI builds complete reliably within runner limits, upstream opted for a minimal feature set on Linux prebuilts, recommending that users who need the full suite compile natively from source.
dartfx/qsv Solutiondartfx/qsv does the heavy lifting so you don't have to compile from source on every deployment:
gcc, g++, musl-dev, libgcc) and native linker flags (-C link-arg=-lgcc)./usr/local/cargo/registry and /build/qsv/target) to successfully compile Polars and all extensions without memory exhaustion..so dependencies. The resulting binary runs natively on any Linux distribution (Alpine, Debian, Ubuntu, RHEL, CentOS, Amazon Linux) or directly inside a scratch container.dartfx/qsv serves as the foundational binary provider across the entire Data Artifex Docker catalog. By compiling and publishing this standalone multi-arch static binary image first, all downstream Data Artifex containers import a guaranteed identical, 100% feature-complete QSV distribution via multi-stage builds:
dartfx/base: Copies /usr/local/bin/qsv directly from dartfx/qsv, combining QSV with Python 3.14, system utilities (curl, jq), and the core Data Artifex toolkits (ckan-toolkit, dataverse-toolkit, ddi-toolkit, rdf-toolkit, qsv-toolkit).dartfx/api-base: Extends dartfx/base to provide high-performance FastAPI/Uvicorn microservices with access to QSV's vectorized Polars query engine.dartfx/n8n: Embeds the static QSV binary alongside the @dartfx/n8n-nodes-qsv extension into the official n8n workflow automation platform.dartfx/n8n-runners: Built on dartfx/base, allowing external task execution nodes to run QSV commands and Python scripts within isolated worker tasks.dartfx/qsv enables all high-performance analytical, transformation, and server features:
| Feature Flag | Commands / Capabilities | Description & Purpose |
|---|---|---|
polars | sqlp, joinp, pivotp, scoresql | Vectorized SQL queries, fast joins, and pivots powered by the Polars engine. |
luau | luau | Embedded Luau (fast Lua dialect with JIT) scripting for complex column transformations. |
to | to | High-speed conversion between CSV and Parquet, Excel (XLSX), ODS, and SQLite. |
readstat | readstat, writestat | Native parsing and conversion of SPSS (.sav), SAS (.sas7bdat), and Stata (.dta) data files. |
geocode | geocode, geoconvert | High-speed local reverse and forward geocoding using indexed GeoNames databases. |
apply | apply | Advanced column transforms: NLP, sentiment analysis, string cleaners, regex patterns, and censors. |
fetch | fetch | Concurrent HTTP REST API queries and URL parameter lookups per row. |
foreach | foreach | Parallel execution of external commands and pipelines for each record in a dataset. |
profile | profile | DCAT-US v3 / Croissant schema metadata profiling with MiniJinja templating. |
synthesize | synthesize | Synthetic mock data generator backed by the fake crate. |
viz | viz | Interactive HTML Plotly charts, histograms, scatter plots, and auto-dashboards (viz smart). |
get | get, dc: prefix | Managed disk-cached downloads with HTTP ETag revalidation and fast streaming slices. |
mcp | Model Context Protocol | Exposes QSV data tools to LLMs via the Anthropic Model Context Protocol. |
feature_capable | Core engine | Always-compiled commands, decompression (.gz, .zst, .sz, .zip), and formatting helpers. |
The few upstream features excluded from this image are omitted intentionally to preserve container immutability, maintain a lean image footprint, and avoid GUI dependencies:
| Feature Flag | Excluded Commands / Crates | Why Excluded from Docker |
|---|---|---|
ui, prompt, clipboard, lens | rfd, arboard, csvlens | Requires Desktop GUI / Windowing Subsystems. These crates rely on native OS file pickers (rfd for macOS Cocoa/Win32/GTK) or X11/Wayland clipboard access (arboard), which do not exist inside headless Linux containers. |
viz_static | Headless Chrome export (plotly_static) | Requires Full Chromium Browser. viz_static requires downloading and running chromedriver + Google Chrome/Chromium to export charts as PNG/PDF. Bundling a full browser would bloat the image by hundreds of megabytes. Interactive HTML output via viz is included instead. |
self_update | qsv --update | Violates Container Immutability. In containerized architecture, updating binary files at runtime is an anti-pattern. Image updates are delivered by pulling a fresh Docker tag (docker pull). |
magika | sniff --magika | Heavy C++ / ML Runtime Dependencies. Google's Magika file-type detector pulls the ONNX Runtime (ort), which introduces heavy dynamic library linking issues with static Musl builds. |
get_cloud | S3 / GCS / Azure streaming | Kept Optional for Minimal Footprint. Embedding the full AWS, GCP, and Azure SDK runtimes (object_store) substantially increases the binary size. For cloud storage, standard volume mounts or cloud CLIs are recommended. |
geoconnex & python | pyshacl, pyo3 | Requires Python Virtual Environments. Requiring Python within the minimal static binary breaks the zero-dependency design. (For Python-enabled workflows, use dartfx/base). |
Run any qsv command against your local data files by mounting your current directory to /data:
# Count rows in a CSV file
docker run --rm -v $(pwd):/data dartfx/qsv count input.csv
# Run Polars SQL queries on CSV or Parquet files
docker run --rm -v $(pwd):/data dartfx/qsv sqlp input.csv "SELECT * FROM _t_1 WHERE score > 80"
# Convert CSV to Parquet
docker run --rm -v $(pwd):/data dartfx/qsv to parquet input.csv -o output.parquet
# Generate an interactive data dashboard
docker run --rm -v $(pwd):/data dartfx/qsv viz smart input.csv --output report.html
Copy the statically compiled binary into any existing base container (Alpine, Debian, Ubuntu, Distroless, or Scratch):
FROM dartfx/qsv:latest AS qsv-source
FROM debian:bookworm-slim
COPY --from=qsv-source /usr/local/bin/qsv /usr/local/bin/qsv
ENTRYPOINT ["/usr/local/bin/qsv"]
linux/amd64 (x86_64)linux/arm64 (Apple Silicon M-series, AWS Graviton)Maintained by Data Artifex
Support: [email protected]
GitHub: https://github.com/dataartifex
Content type
Image
Digest
sha256:e4efb1354…
Size
63.5 MB
Last updated
8 days ago
docker pull dartfx/qsv