Skip to main content
Hoop publishes its gateway and agent as container images on Docker Hub. This page describes each image so you can pick the right one, and shows how to build a custom image when none of them fits your environment.

Choosing an image

Running the gateway

Use hoophq/hoop

Running an agent

Use hoophq/hoopdev, or a slim hoophq/hoopagent flavour
For agents, the choice comes down to what your connections need to run inside the container:
Custom and command-line connections work by executing a program inside the container, so they need an image that contains that program. If you deploy a slim flavour and a connection needs tooling it doesn’t have, that connection fails while the agent stays up and keeps serving its other connections — check the agent logs and switch to hoophq/hoopdev.

Published images

Every image is a multi-architecture manifest covering linux/amd64 and linux/arm64, with one exception: the GPU OCR tag (hoophq/hoop-agent-ocr:<version>-gpu) is linux/amd64 only, because it is built against CUDA. Pin an explicit version in production rather than using latest.
Every version, its changelog and its release date are published on the hoophq/hoop releases page. Use it to see what is current, what changed between two versions, and how often releases ship. Image tags and binary downloads use the same version numbers.

hoophq/hoop — Gateway

The Hoop gateway: the API, the web app, and the gRPC endpoint that agents and clients connect to. Built on Ubuntu 24.04.
This image carries the same multi-call binary as the agent images, so hoop start agent runs here too. For agents, prefer hoophq/hoopdev or a hoophq/hoopagent flavour — that is what the Docker Compose deployment does, running the gateway and the agent as separate services from hoophq/hoop and hoophq/hoopdev respectively.

hoophq/hoopdev — Agent with bundled tooling

The general-purpose agent image. Contains the hoop binary plus the client tooling that custom and command-line connections execute inside the container: It also contains the companion binary that serves RDP connections. Runs as root, because the bundled tooling expects it.

hoophq/hoopagent — Slim agent

The hoop binary and nothing else, in two flavours. Both run as unprivileged uid 10001 and serve every connection type the agent handles in-process: PostgreSQL, MySQL, SQL Server, MongoDB, TCP, HTTP, SSH and AWS SSM. Both are a fraction of the size of hoophq/hoopdev and carry no AGPL- or SSPL-licensed components.
hoophq/hoopagent has no unsuffixed tag and no latest. Always name a flavour and a release, for example hoophq/hoopagent:1.135.1-minimal.

hoophq/hoop-agent-ocr — Agent with a bundled OCR engine

hoophq/hoopdev plus an OCR engine, for live redaction of Remote Desktop sessions. The engine reads the RDP session’s video frames as they stream through the agent, detects sensitive values on screen, and masks them before the frames reach the user — so credentials, personal data and other regulated fields never render on the operator’s display. Recognition runs on loopback inside the container, so screen contents never leave the agent.
This image requires a GPU instance. Redacting a live video stream means running OCR on every frame in real time, which needs GPU acceleration to keep up with the session. Deploy it on a GPU node with the NVIDIA device plugin and container runtime installed.
Live redaction is enabled per organisation and also needs a Presidio analyzer — see Presidio.

hoophq/agent-tools — Base image

The base layer hoophq/hoopdev is built from: the bundled client tooling without the Hoop binary. Published so you can build your own agent image on the same tooling set — see Extending the tooling image below.

Building a custom image

If none of the published images fits — you need an extra database client, an internal CA, a company base image, or a hardening baseline — build your own. Every release publishes the Hoop binaries as tarballs, so a custom image is usually a short Dockerfile.

Released binaries

Each Linux tarball contains two files: Darwin and Windows tarballs are published under the same URL pattern for CLI use.
The architecture is named x86_64 and arm64 in the filenames, matching uname -m. Docker’s TARGETARCH uses amd64 and arm64, so a multi-arch build needs to map one to the other — the example below does this.

Option 1: starting from a base image of your choice

Each example downloads the tarball, verifies it against the published checksums.txt, and extracts the binary. The verification runs inside the build, so a corrupted or tampered download fails the build rather than producing a broken image. Pick the base you already standardise on. Add the tooling your connections need where the comment indicates.
Dockerfile
Build and run any of them:
In a single-stage build, deleting the tarball in a later layer does not shrink the image — the earlier layer still holds the bytes. Delete it in the same RUN that created it, as the Ubuntu and Alpine examples do, or use the two-stage pattern from the Distroless tab.
To include RDP support on a glibc base, extract ./hoop_rs alongside ./hoop:

Option 2: extending the tooling image

If you want everything in hoophq/hoopdev plus one or two extra packages, the shortest path is to extend the published image:
Dockerfile
To build on the tooling set without the Hoop binary, start FROM hoophq/agent-tools:<tag> instead and add the binary as in Option 1. The tag to use is the one referenced by the Hoop release you are targeting.

Verifying a download outside a build

The Dockerfiles above verify the tarball as part of the build. To check one by hand — when mirroring releases to an internal artifact store, for example:
The paths in checksums.txt are build-time paths, so match on the filename rather than the whole line. Each architecture is listed under two equivalent names (x86_64 and amd64, arm64 and aarch64) with the same hash; anchoring the match to the end of the line picks exactly one.

Requirements for a custom agent image

Whatever base you choose, a working agent image needs:
1

A CA certificate bundle

The agent connects to the gateway over TLS and verifies the certificate against the system trust store. On Debian and Ubuntu this means the ca-certificates package. Alternatively, set HOOP_TLSCA to pin a private CA. Minimal base images frequently omit this and it is the most common cause of a custom image failing to connect.
2

The binary on PATH, or an absolute command

Either put the directory containing hoop on PATH, or use the absolute path in your CMD.
3

The right command

hoop start agent. How you express that depends on whether your image sets an ENTRYPOINT — see Command and entrypoint below. The simplest custom image sets no ENTRYPOINT and puts the whole command in CMD ["hoop", "start", "agent"], as the examples above do.
4

Any tooling your connections execute

Custom and command-line connections run a program inside the container. If the program is missing, that connection fails.
Nothing else is required. The agent is configured entirely through environment variables, writes nothing to disk, and needs no volume — HOOP_KEY is the only mandatory variable. It opens one outbound connection to the gateway and listens on no ports, so it needs no inbound firewall rules and runs fine as a non-root user with a read-only root filesystem.

Command and entrypoint per image

Kubernetes maps command to the image’s ENTRYPOINT and args to its CMD. The published images do not all use the same contract, so which one you override depends on the image:
On hoophq/hoopdev and hoophq/hoop, replacing command removes tini. Those images run connection commands that fork child processes, and tini is what reaps them — without it, long-lived agents accumulate zombie processes. Override args instead.
Neither hoophq/hoopagent flavour needs an init shim: it ships no shell or client tooling, so the agent never forks a child process, and it handles SIGTERM itself. If you build a custom image, pick one contract and document it. The examples in this page set no ENTRYPOINT, matching hoophq/hoopagent.

Keeping a custom image current

A custom image pins a Hoop version you have to bump yourself. Rebuild it as part of your upgrade process, and rebuild periodically even without a Hoop upgrade so the base image picks up operating-system security updates. Follow the hoophq/hoop releases page to know when a new version is available and what it changes — you can watch the repository’s releases on GitHub to be notified.