Choosing an image
Running the gateway
Use
hoophq/hoopRunning an agent
Use
hoophq/hoopdev, or a slim hoophq/hoopagent flavourCustom 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 coveringlinux/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.
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/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.
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
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 publishedchecksums.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.
- Ubuntu
- Alpine
- Distroless
Dockerfile
./hoop_rs alongside ./hoop:
Option 2: extending the tooling image
If you want everything inhoophq/hoopdev plus one or two extra packages, the
shortest path is to extend the published image:
Dockerfile
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: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: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.The binary on PATH, or an absolute command
Either put the directory containing
hoop on PATH, or use the absolute
path in your CMD.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.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 mapscommand 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:
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.