Skip to content

Docker

The same pipeline on a machine that has Docker and nothing else: no Nix, no sbt, no Ollama install (MIP-0008). Moved from Run it locally §10. How the images are built, every tag, the compose profiles and the native build are marola-app's Images; flags and variables are its CLI and configuration references.

Log in to GHCR

The image is ghcr.io/marola-dev/marola-app. Until the package is made public (MIP-0065 §4.3), pulling needs docker login ghcr.io with a GitHub token that has read:packages, for example:

gh auth token | docker login ghcr.io -u <your-github-user> --password-stdin

gh auth refresh -s read:packages adds the scope to the gh CLI's token if it lacks it.

Run the image

jvm is the CLI on a Java 25 runtime, with the pinned corpus inside, and follows main; with no arguments it runs --brief. Against an Ollama already running on the host:

docker run --rm --network host ghcr.io/marola-dev/marola-app:jvm --brief --lat -27.6733 --lon -48.47
docker run --rm --network host -e MAROLA_LOCAL_LLM_MODEL=llama3.2:1b \
  ghcr.io/marola-dev/marola-app:jvm --summarize --lat -27.6733 --lon -48.47

--network host lets the container reach the host's localhost:11434. The first command needs no model; the second needs the one you pulled in Run it locally §2.

native is the same CLI compiled ahead of time by GraalVM: one executable, no JVM, amd64 only, same flags. The MCP server is not in it; it stays on jvm.

Ollama in a container too: compose

marola-app's docker-compose.yml runs the jvm image with an Ollama sidecar, and pulls the model once into a named volume:

# in a marola-app checkout
docker compose run --rm marola --brief --lat -27.6733 --lon -48.47                            # no LLM
docker compose --profile ollama run --rm marola --summarize --lat -27.6733 --lon -48.47       # + draft and reviewer
docker compose --profile local run --rm marola-local --summarize --lat -27.6733 --lon -48.47  # the marola-llama3.2 variant

The ollama profile pulls MAROLA_LOCAL_LLM_MODEL (llama3.2, 2 GB, by default); MAROLA_LOCAL_LLM_MODEL=llama3.2:1b in your shell or .env picks the small model instead. .env is read when present and never copied into the image. The profile pulls no embedding model, so the corpus paths (--ask) fail there until marola-dev/marola-app#12 is fixed.

The local profile runs marola-ml's ghcr.io/marola-dev/marola-ml:local: Ollama with the marola-llama3.2 variant (Ask the ocean notes) already inside. It only advances when the benchmark clears marola-ml's gate; each candidate also keeps a local-<sha> tag, promoted or not.

Built with Llama. :local redistributes Meta's Llama 3.2 weights under the Llama 3.2 Community License; the agreement and the Acceptable Use Policy ship inside the image (ollama show marola-llama3.2 --license).