Container Images¶
Record Store publishes two production images to the GitHub Container Registry.
| Image | Contains |
|---|---|
ghcr.io/openelementslabs/record-store |
The server daemon and the record-store CLI |
ghcr.io/openelementslabs/record-store-console |
The web console |
They are separate on purpose: a headless deployment carries no frontend, and the console upgrades on its own schedule. See Docker Compose for running them together.
docker pull ghcr.io/openelementslabs/record-store:0.1.1
docker pull ghcr.io/openelementslabs/record-store-console:0.1.1
Architectures¶
Every release publishes a multi-platform manifest covering linux/amd64 and
linux/arm64. One pull resolves the architecture it runs on; there are no
per-architecture tags to choose between.
Tags¶
| Tag | Points at | Use it for |
|---|---|---|
0.1.1 |
Exactly that release, forever | Production |
0.1 |
The newest patch of 0.1 | Automatic patch updates |
0 |
The newest 0.x release | Rarely what you want before 1.0 |
latest |
The newest stable release | Trying it out |
sha-<short> |
One commit | Tracing an image back to source |
Pre-releases publish only their exact version and their commit tag. They never
move latest, and never move a floating version tag.
latest is a convenience, not a deployment strategy. It changes underneath a
running deployment, and it tells you nothing about what you are running.
Version tags are immutable¶
A published version tag is never rebuilt. Once 0.1.1 exists, that tag keeps
pointing at that image; a fix ships as 0.1.2.
That is a promise about the release process, not something the registry enforces. The strong form is a digest.
Pinning a digest¶
A version tag selects a release. A digest selects an artifact.
ghcr.io/openelementslabs/record-store:0.1.1
convenient, readable, and correct as long as the release process is
ghcr.io/openelementslabs/record-store@sha256:<digest>
the exact bytes, verifiable, and impossible to repoint
Find the digest of what you are about to deploy:
docker buildx imagetools inspect ghcr.io/openelementslabs/record-store:0.1.1 \
--format '{{ .Manifest.Digest }}'
Then pin it:
Every release lists both images' digests in its release notes. Use digests wherever a deployment must be reproducible, and version tags everywhere else.
Compose¶
deploy/docker/compose.ghcr.yml runs the server and the console from the
published images, with no build step and no repository checkout:
The other Compose files under deploy/docker/ build from source, which is what
you want while developing. See Docker Compose.
Coolify needs a different file: compose.ghcr.yml publishes host ports and
declares no Coolify magic variables, so Coolify finds no domain to assign. Use
deploy/docker/docker-compose.ghcr.yaml, which runs the same published images in
the shape Coolify expects — see Coolify.
Authentication¶
None. Both packages are public, so docker pull works anonymously — no
docker login, no token, nothing to configure in an orchestrator.
A package's visibility is set per package in its GitHub package settings and is independent of the repository's. Making the repository public does not carry the packages with it; each was made public explicitly.
What the release publishes¶
Alongside the images, each release carries:
- SPDX SBOMs, per image and per architecture, attached to the release.
-
Linux binary archives with
record-storeandrecord-store-server, extracted from the published images so an archive and a container never hold different builds, and aSHA256SUMSfile covering every asset. -
Signed build provenance on the published index, and a signed SBOM attestation per architecture, verifiable with
gh attestation verify.
Provenance exists only for releases built after attestation was enabled; 0.1.1
and earlier have none. See Verifying a Release.
macOS binaries are not published. Build from source with cargo build --release
— see Installation.