Where to pull from
| Registry | Image | Pull command |
|---|---|---|
| Docker Hub | usebruno/cli | docker pull usebruno/cli |
| GitHub Container Registry | ghcr.io/usebruno/cli | docker pull ghcr.io/usebruno/cli |
Image variants
| Variant | Base image | Size | When to use |
|---|---|---|---|
| Alpine (default) | node:22-alpine | ~141 MB | Best for most cases — smallest footprint. |
| Debian | node:22-slim | ~162 MB | When Alpine hits SSL or glibc compatibility issues. |
linux/amd64 and linux/arm64.
Tags
| Style | Example | Behavior |
|---|---|---|
| Exact | usebruno/cli:3.4.2 | Immutable — recommended for production CI. |
| Minor | usebruno/cli:3.4 | Receives patch updates (3.4.x). |
| Major | usebruno/cli:3 | Receives any 3.x.x update. |
| Latest | usebruno/cli:latest | Moves only when explicitly tagged. |
:latest, :3.4.2, :3.4, :3) always resolve to the Alpine variant. Append -debian for the Debian variant (e.g. usebruno/cli:3.4.2-debian).
Quick start
Pull the image and verify it works:docker pull downloads the image to your machine. docker run starts a container from that image — anything after the image name (usebruno/cli) is passed as arguments to bru, so --version prints the CLI version.
Run a collection
The Docker container needs access to your collection files to run them. Use the-v (volume mount) flag to map a directory on your host to /bruno inside the container. The path should always be mapped to /bruno — that’s the working directory the CLI expects.
Since the image’s entrypoint is already set to bru, running usebruno/cli run is the same as running bru run on your local machine. Any arguments you pass after the image name go straight to the CLI.
- Bash / Zsh / WSL
- PowerShell
- Windows CMD
Run a subfolder or single request
Choose an environment
Pass environment variables
Generate a report
For all
bru run options — environments, variables, reporters, tags, parallel execution, and more — see Run Command Options.Collection at a different path
If your collection is not in the current directory, point Docker at its path:Two usage patterns
Mount at runtime (no image build needed)
Best for local development and ad-hoc runs.Bake collection into a custom image
Best for CI pipelines and distributable test suites. Create aDockerfile next to your bruno.json:
The base image runs as
USER node (UID 1000) for security. Use --chown=node:node in COPY so the runtime user can write reports back to the mount.CI/CD examples
GitHub Actions
GitLab CI
Docker Compose
Image details
| Property | Value |
|---|---|
| Entrypoint | bru |
| Working directory | /bruno |
| Runtime user | node (UID 1000, non-root) |
| Architectures | linux/amd64, linux/arm64 |
Troubleshooting
UID mismatch on Linux hosts
UID mismatch on Linux hosts
Files written by the container may appear owned by a foreign UID. Fix with:macOS Docker Desktop handles UID translation automatically.
SSL or glibc errors with Alpine
SSL or glibc errors with Alpine
The musl libc in Alpine can occasionally cause issues with native Node modules or SSL. Switch to the Debian variant:
Windows drive letter conflicts with -v
Windows drive letter conflicts with -v
The Or run inside WSL where POSIX paths work directly.
-v flag uses a colon separator that collides with Windows drive letters. Use --mount instead:Nested subfolders not running
Nested subfolders not running
Bruno CLI’s
run is non-recursive by default. If your collection has nested subfolders, add -r: