Base Odoo runtime image.
This repository owns the base runtime build for Odoo 19. It compiles a
deterministic runtime from the upstream Odoo source, then layers in uv,
PostgreSQL 17 client tools, and compatibility paths used by downstream
deployment tooling.
This repository provides a stable base runtime for downstream project images.
runtime: base Odoo runtime + PostgreSQL client + uv toolingruntime-devtools:runtimeplus Chromium test tooling
Both images default to the ubuntu user for compatibility with existing
restore and SSH mount workflows.
runtimestays runtime-first and does not write IDE-oriented Python path entries.runtime-devtoolswrites a minimalodoo_paths.pthfor generic non-core source and addon roots used in local development tooling:/odoo/opt/project/addons/opt/extra_addons
/odoo/odoo-binis a compatibility wrapper over upstream/usr/local/bin/odoo-source-bin.- The wrapper must preserve Odoo subcommands (
server,shell,db, etc.). - Runtime defaults (
--db_host,--addons-path, etc.) are injected only for server-style invocations so non-server commands keep upstream argument parsing semantics.
- Downstream images inherit a single shared Python environment at
/venv. /venvis not configurable; downstream images must extend it additively and must not recreate it.- The image reserves these downstream layout paths:
/opt/project/opt/project/addons/opt/extra_addons
odoo-python-sync.sh <prod|dev>installs root lockfile-backed dependencies plus addonrequirements*.txtand addonpyproject.tomldependencies into/venv.ODOO_PYTHON_SYNC_SKIP_ADDONScan exclude a comma-separated set of addon directory names from Python dependency sync when a downstream workflow needs addon code on the path without packaging it into/venv.odoo-fetch-addons.shdownloads external addon repositories declared inODOO_ADDON_REPOSITORIESinto/opt/extra_addons.- Neither helper bakes in project-specific policy; downstream images choose
which external repositories to fetch and whether to sync
prodordevdependencies.
- Every run builds test images first and executes smoke checks.
- Publish only happens after smoke checks pass.
schedule(daily) publishesnightly-*tags and immutablesha-*tags.pushtomainpublishes stable19.0-*tags and immutablesha-*tags.pull_requestruns verify-only (no image publishing).
This lets us keep a daily canary stream while protecting stable tags behind the same verification gate.
- Verify jobs run on the
chris-testing-buildself-hosted lane and still use ephemeral Buildx builders withtype=ghacache because they only build single-platform smoke images. - Publish jobs run on the
chris-testing-publish-cacheself-hosted lane and reuse a persistent per-runner Buildx builder, with GHCR registry cache as the portable fallback. - The publish workflow prunes cache entries older than 14 days after each run so local BuildKit state stays warm without growing forever.
This keeps the expensive multi-arch publish path warm on the self-hosted runner while still giving us a recoverable remote cache when a builder is recreated.
The GHCR retention workflow keeps stable and nightly tags, preserves the newest
10 immutable sha-* tags per image suffix, and prunes untagged versions older
than 7 days.
- A scheduled
Runner Healthworkflow tracks root filesystem and Docker root usage onchris-testingdaily. - The health workflow runs on
chris-testing-publish-cacheso it does not consume thechris-testing-buildverification lane. - The check fails when usage crosses the configured thresholds so operators get a visible GitHub Actions alert before the runner reaches saturation.
The workflow resolves the current odoo/odoo 19.0 commit and pins that exact
revision into the build. This gives repeatable artifacts per run and makes
nightly updates explicit.
uv is copied from Astral's official container image and pinned by tag+digest
in the Dockerfile. A GitHub-native Dependabot config watches that image
reference and opens update PRs whenever a new uv release is available.
docker build \
-t ghcr.io/cbusillo/odoo-docker:19.0-runtime \
--target runtime \
.
docker build \
-t ghcr.io/cbusillo/odoo-docker:19.0-devtools \
--target runtime-devtools \
.- Do not add credentials or access tokens in this repo.
- Proprietary addons should be fetched by downstream builds using BuildKit
secrets via
odoo-fetch-addons.sh.