177 lines
7.0 KiB
Markdown
177 lines
7.0 KiB
Markdown
# Docker Images
|
|
|
|
Floci publishes images to [Docker Hub (`floci/floci`)](https://hub.docker.com/r/floci/floci).
|
|
|
|
Every image tag combines two independent choices: **what's inside** (variant) and **how stable it is** (channel).
|
|
|
|
## Axis 1: Variant (what's inside)
|
|
|
|
| Variant | Contents | When to use |
|
|
|---|---|---|
|
|
| **Standard** | Floci native binary only | General use: CI, local dev, Testcontainers **(recommended)** |
|
|
| **Baseline** | Floci native binary compiled for ARMv8.0 (`armv8-a`) | ARM64 hosts without LSE, including Raspberry Pi 4-class CPUs |
|
|
| **Compat** | Floci + Python 3 + AWS CLI + boto3 | Workflows that need AWS tooling available inside the container |
|
|
|
|
The compat image runs the same native binary as the standard image, so startup time and memory footprint are identical. Only the image size increases. The baseline image is different: it is an ARM64-only release artifact compiled for the ARMv8.0 ISA floor and is not published on nightly channels.
|
|
|
|
The standard image is built on Red Hat UBI 9 micro. Besides Floci it contains only bash and coreutils. There is no package manager, curl, grep or sed inside. Pick the compat image when you need tools inside the container.
|
|
|
|
## Axis 2: Channel (how stable)
|
|
|
|
| Channel | Source | Published |
|
|
|---|---|---|
|
|
| **Release** | Tagged version (e.g. `x.y.z`) | 1st and 3rd Tuesday of each month |
|
|
| **Nightly** | Tip of `main` | Every night at 23:00 CT |
|
|
|
|
Release images are stable and recommended for most use cases. Between trains, `nightly` carries every merged fix from the following morning. Nightly images track active development and may include unreleased changes.
|
|
|
|
## Full Tag Matrix
|
|
|
|
Combining both axes gives the complete set of published tags:
|
|
|
|
| | Standard | Baseline (ARM64 only) | Compat |
|
|
|---|---|---|---|
|
|
| **Release (latest)** | `latest` ✅ | `latest-baseline` | `latest-compat` |
|
|
| **Release (pinned)** | `x.y.z` | `x.y.z-baseline` | `x.y.z-compat` |
|
|
| **Nightly (floating)** | `nightly` | — | `nightly-compat` |
|
|
| **Nightly (dated)** | `nightly-mmddyyyy` | — | `nightly-mmddyyyy-compat` |
|
|
|
|
Dated nightly tags (e.g. `nightly-05022026`) name one night's build of `main`. A same-day rerun of the nightly workflow republishes that day's tag, so for a build you can rely on not changing, pin a release version.
|
|
|
|
!!! warning
|
|
Nightly images may include unreleased or experimental changes. Use release tags in production-like environments.
|
|
|
|
## Quick Reference
|
|
|
|
```yaml title="docker-compose.yml"
|
|
# Standard release : recommended
|
|
image: floci/floci:latest
|
|
|
|
# Compat release : includes AWS CLI and boto3
|
|
image: floci/floci:latest-compat
|
|
|
|
# ARM64 baseline release : Raspberry Pi 4 / pre-LSE AArch64 cores
|
|
image: floci/floci:latest-baseline
|
|
|
|
# Pinned release : reproducible builds
|
|
image: floci/floci:x.y.z
|
|
|
|
# Nightly : track main
|
|
image: floci/floci:nightly
|
|
```
|
|
|
|
## Multi-Architecture
|
|
|
|
Standard and compat images are published as multi-arch manifests supporting `linux/amd64` and `linux/arm64`. Baseline images are intentionally `linux/arm64` only.
|
|
|
|
## Raspberry Pi 4 and older ARM64 CPUs
|
|
|
|
If the standard ARM64 image exits with `CPU features [FP, ASIMD, CRC32, LSE] not supported`, use the `-baseline` release tag. The baseline image is compiled with GraalVM `-march=armv8-a`, so it does not require LSE. For example, use `floci/floci:latest-baseline` or pin `floci/floci:x.y.z-baseline`.
|
|
|
|
The baseline variant currently covers the Docker image only. The standalone `floci-linux-arm64` binary remains tracked in [#1114](https://github.com/floci-io/floci/issues/1114).
|
|
|
|
## Reusable Image Publishing
|
|
|
|
The `Build Floci Images` reusable workflow publishes a JVM image for an exact
|
|
branch, tag, or commit by default. This matches the ordinary Maven package and
|
|
the repository's local-development Docker image. A calling repository owns the
|
|
trigger, destination registry, credentials, and package permissions; the shared
|
|
workflow owns the multi-architecture manifest, image labels, and provenance
|
|
output.
|
|
|
|
For example, a fork can keep this small manual caller on its default branch:
|
|
|
|
```yaml title=".github/workflows/publish-images.yml"
|
|
name: Publish Floci Images
|
|
|
|
on:
|
|
workflow_dispatch:
|
|
inputs:
|
|
source-ref:
|
|
description: Floci branch, tag, or commit to publish
|
|
required: true
|
|
type: string
|
|
default: main
|
|
|
|
permissions:
|
|
contents: read
|
|
packages: write
|
|
|
|
jobs:
|
|
publish:
|
|
uses: floci-io/floci/.github/workflows/build-images.yml@main
|
|
with:
|
|
source-ref: ${{ inputs.source-ref }}
|
|
image: ghcr.io/${{ github.repository_owner }}/floci
|
|
```
|
|
|
|
Pin the reusable workflow to a trusted tag or full commit SHA when the caller
|
|
requires a stable build contract. The caller's `GITHUB_TOKEN` publishes a GHCR
|
|
image only below the caller's repository owner. Calls targeting another OCI
|
|
registry must pass `REGISTRY_USERNAME` and `REGISTRY_TOKEN` through the reusable
|
|
workflow's declared secrets.
|
|
|
|
The default workflow publishes a build-and-commit-derived convenience tag:
|
|
|
|
- `<YYYYMMDD.HHMMSS>.<commit-sha-8>` for the JVM image
|
|
|
|
Callers that also need native artifacts can pass `publish-native: true`. This
|
|
adds `<YYYYMMDD.HHMMSS>.<commit-sha-8>-native` and
|
|
`<YYYYMMDD.HHMMSS>.<commit-sha-8>-native-compat`; it does not change the
|
|
unqualified JVM tag. Timestamps are generated in UTC.
|
|
|
|
Each workflow invocation produces a new timestamped tag. The workflow returns
|
|
the digest-qualified JVM reference (plus native references when requested) and
|
|
uploads them in a provenance JSON artifact. Downstream tests should use a
|
|
digest-qualified reference when they require an immutable image:
|
|
|
|
```text
|
|
ghcr.io/example/floci@sha256:...
|
|
```
|
|
|
|
## What's in the Compat Image
|
|
|
|
The compat image adds the following to the standard image contents:
|
|
|
|
- Python 3 + pip
|
|
- [AWS CLI](https://pypi.org/project/awscli/) (via pip)
|
|
- [boto3](https://pypi.org/project/boto3/) (via pip)
|
|
|
|
The AWS CLI is pre-configured to talk to the local Floci endpoint, so no `--endpoint-url` flag is needed in hook scripts:
|
|
|
|
```sh
|
|
#!/bin/sh
|
|
aws sqs create-queue --queue-name my-queue # works without --endpoint-url
|
|
aws s3 mb s3://my-bucket
|
|
```
|
|
|
|
The following environment variables are set in both the standard and compat images:
|
|
|
|
| Variable | Value |
|
|
|---|---|
|
|
| `AWS_DEFAULT_REGION` | `us-east-1` |
|
|
| `AWS_ACCESS_KEY_ID` | `test` |
|
|
| `AWS_SECRET_ACCESS_KEY` | `test` |
|
|
| `AWS_CONFIG_FILE` | `/etc/floci/aws/config` |
|
|
|
|
The compat image additionally sets:
|
|
|
|
| Variable | Value |
|
|
|---|---|
|
|
| `AWS_ENDPOINT_URL` | `http://localhost:4566` |
|
|
|
|
Override any of them at runtime via `docker run -e` or the Compose `environment` block.
|
|
|
|
## Local Development
|
|
|
|
The project ships a `docker-compose.yml` at the repository root configured for local development.
|
|
By default it uses `docker/Dockerfile`, a fast Ubuntu Noble/glibc JVM image suited for iteration
|
|
with Java 25. The release and nightly images use the native Dockerfiles described above. Switch the
|
|
`dockerfile` entry to test the native image locally:
|
|
|
|
```yaml title="docker-compose.yml"
|
|
build:
|
|
context: .
|
|
dockerfile: docker/Dockerfile.native # or docker/Dockerfile for fast JVM dev build
|
|
```
|