From 2492e433498668037f28f25cfa643c3374ce0c31 Mon Sep 17 00:00:00 2001 From: "Benjamin R. J. Schwedler" Date: Thu, 19 Feb 2026 13:41:01 -0600 Subject: [PATCH 1/2] Add Presentation for Feb 2026 state --- presentations/2026-02/.gitignore | 2 + presentations/2026-02/_quarto.yml | 4 + presentations/2026-02/index.qmd | 196 ++++++++++++++++++++++++++++++ 3 files changed, 202 insertions(+) create mode 100644 presentations/2026-02/.gitignore create mode 100644 presentations/2026-02/_quarto.yml create mode 100644 presentations/2026-02/index.qmd diff --git a/presentations/2026-02/.gitignore b/presentations/2026-02/.gitignore new file mode 100644 index 00000000..ad293093 --- /dev/null +++ b/presentations/2026-02/.gitignore @@ -0,0 +1,2 @@ +/.quarto/ +**/*.quarto_ipynb diff --git a/presentations/2026-02/_quarto.yml b/presentations/2026-02/_quarto.yml new file mode 100644 index 00000000..7d3da245 --- /dev/null +++ b/presentations/2026-02/_quarto.yml @@ -0,0 +1,4 @@ +project: + title: "Posit Container Images: 2026-02" + preview: + port: 12358 diff --git a/presentations/2026-02/index.qmd b/presentations/2026-02/index.qmd new file mode 100644 index 00000000..214072f6 --- /dev/null +++ b/presentations/2026-02/index.qmd @@ -0,0 +1,196 @@ +--- +title: "Posit Container Images" +subtitle: "Ecosystem Overview" +author: Ben Schwedler +date: "2026-02-19" +format: + revealjs: + theme: moon + width: 1280 + height: 720 + center: true +--- + +> A developer screamed, "This is crazy!" +> +> The matrix of builds left me hazy. +> +> One file, one run, +> +> And Bakery's done— +> +> Now I sip my coffee, lazy. + +## The Ecosystem at a Glance {.smaller} + +6 repos, 7 images, one CLI + +| Repository | Images | +|:-----------|:-------| +| [images-connect](https://github.com/posit-dev/images-connect) | `connect`, `connect-content`, `connect-content-init` | +| [images-package-manager](https://github.com/posit-dev/images-package-manager) | `package-manager` | +| [images-workbench](https://github.com/posit-dev/images-workbench) | `workbench`, `workbench-session`, `workbench-session-init` | +| [images-shared](https://github.com/posit-dev/images-shared) | `bakery` CLI, shared CI workflows & Actions | +| [images-examples](https://github.com/posit-dev/images-examples) | Tutorials & extending examples | +| [images](https://github.com/posit-dev/images) | Meta repo & docs | + +Each product repo is independent -- one `bakery.yaml`, static Containerfiles, own CI. + +[Ecosystem overview & docs index](https://github.com/posit-dev/images) + +## What's New Since September 2025 {.smaller} + +:::: {.columns} +::: {.column width="50%"} + +**Images** + +* Ubuntu 24.04 primary OS for latest releases +* ARM64 native builds for Package Manager +* `connect-content` matrix image (R × Python) +* `workbench-session` matrix image (R × Python) +* Dev streams -- daily/preview auto-publish + +::: +::: {.column width="50%"} + +**Bakery & CI** + +* Matrix builds w/ dynamic dependency resolution +* Native multi-platform CI (build per arch, merge manifests) +* Split CI workflows (production vs development) +* Registry cache cleanup automation + +::: +:::: + +## Image Variants {.smaller} + +Each image ships with use-case-specific variants: + +| Image | Variants | Purpose | +|:------|:---------|:--------| +| `connect` | `std` / `min` | Server ± R, Python, Quarto | +| `package-manager` | `std` / `min` | Server ± R, Python | +| `workbench` | `std` / `min` | IDE server ± R, Python | +| `connect-content` | `base` / `pro` | Runtime ± Pro Drivers | +| `workbench-session` | *(none)* | R × Python matrix | +| `*-init` | *(none)* | Init containers | + +**Standard** = runs out of the box. + +**Minimal** = [extend](https://github.com/posit-dev/images-examples/tree/main/extending) with what you need. [Variant config docs](https://github.com/posit-dev/images-shared/blob/main/posit-bakery/CONFIGURATION.md#imagevariant) + +## Image Matrices {.smaller} + +`bakery` generates versions from the cartesian product of R × Python combinations: + +```yaml +matrix: + namePattern: "R{{ Dependencies.R }}-python{{ Dependencies.python }}" + dependencyConstraints: + - dependency: R + constraint: { min: "4.3", latest: true } + - dependency: python + constraint: { min: "3.11", latest: true } +``` + +Versions resolve dynamically from external APIs (uv, Posit CDN, quarto.org). + +Used by `connect-content` and `workbench-session` — [config docs](https://github.com/posit-dev/images-shared/blob/main/posit-bakery/CONFIGURATION.md) | [example](https://github.com/posit-dev/images-examples/tree/main/bakery/06-matrix-images) + +## How Bakery Works {.smaller} + +:::: {.columns} +::: {.column width="50%"} + +**[Templates](https://github.com/posit-dev/images-shared/blob/main/posit-bakery/TEMPLATING.md)** (Jinja2) + +* Macros for APT/DNF, Python (via uv), R (via r-install), Quarto +* Rendered per version × variant × OS +* Output: static `Containerfile` +* Build images with docker/buildah/podman + +::: +::: {.column width="50%"} + +**[Build](https://github.com/posit-dev/images-shared/blob/main/posit-bakery/ARCHITECTURE.md)** + +* Generates Buildx Bake plan (JSON) +* Parallel target builds +* Registry-based layer caching +* Automatic tag generation + +::: +:::: + +```text +connect/ +├── template/ # Jinja2 source +│ └── Containerfile.jinja2 +├── 2025.12/ # Rendered output +│ ├── Containerfile.ubuntu2404.std +│ └── Containerfile.ubuntu2404.min +└── 2026.01/ +``` + +## Registries & Tags {.smaller} + +Published to **[Docker Hub](https://hub.docker.com/u/posit)** (`docker.io/posit/`) and **[GHCR](https://github.com/orgs/posit-dev/packages)** (`ghcr.io/posit-dev/`). + +| Tag | Example | +|:----|:--------| +| `--` | `2026.01.1-ubuntu-24.04-std` | +| `-` | `2026.01.1-ubuntu-24.04` | +| `` | `2026.01.1` | +| `latest` | Latest primary variant + primary OS | + +Short tags (without `-std`/`-min`) resolve to the **primary** variant. + +Preview/daily builds push under `*-preview` names. [Tag pattern config](https://github.com/posit-dev/images-shared/blob/main/posit-bakery/CONFIGURATION.md#tagpattern) + +## CI Workflows {.smaller} + +Shared workflow patterns in `images-shared` ([CI docs](https://github.com/posit-dev/images-shared/blob/main/CI.md)): + +| Workflow | Method | +|:---------|:-------| +| `bakery-build-native.yml` | Native ARM + AMD runners, merge manifests | +| `bakery-build.yml` | QEMU emulation | + +Both support: + +* **Production** -- build, test, push on merge to `main` +* **Development** -- auto-publish daily/preview streams +* **Weekly rebuilds** for OS security patches +* **Registry cleanup** -- purge dangling caches and temp images + +## Extending Minimal Images + +Patterns for extending Minimal images ([`images-examples`](https://github.com/posit-dev/images-examples/tree/main/extending)): + +| Example | Description | +|:--------|:------------| +| CA certificates | Custom CA certs | +| Python / R | Language versions | +| System dependencies | System libraries | +| pip.conf | Custom pip config | +| VS Code extensions | Pre-installed extensions | + +[Bakery examples](https://github.com/posit-dev/images-examples/tree/main/bakery): single-image builds through matrix configurations. + +## What's Next {.smaller} + +[GitHub Milestones](https://github.com/orgs/posit-dev/projects/17/views/8) + +| Milestone | Description | +|:----------|:------------| +| Ubuntu 24.04 in preview | Public preview of 24.04 images | +| Connect ARM support | Multi-platform images for Connect | +| Product dogfood/CI adoption | Product teams adopt images in CI | +| Helm deployments | CI auto-deploys to K8s via Helm | +| Out of preview | Public repos, official support | +| Workbench ARM images | Multi-platform images for Workbench | +| Image security scans | Scanning as quality gate before push | + +[Questions & feedback](https://github.com/posit-dev/images/discussions) From 3f8ebe76e036dd6ccd26cfaca903aedbb5d8dfe6 Mon Sep 17 00:00:00 2001 From: "Benjamin R. J. Schwedler" Date: Fri, 20 Feb 2026 09:47:27 -0600 Subject: [PATCH 2/2] Presentation updates from initial review --- presentations/2026-02/index.qmd | 61 +++++++++++++++++++++++---------- 1 file changed, 42 insertions(+), 19 deletions(-) diff --git a/presentations/2026-02/index.qmd b/presentations/2026-02/index.qmd index 214072f6..3aabe76f 100644 --- a/presentations/2026-02/index.qmd +++ b/presentations/2026-02/index.qmd @@ -20,6 +20,8 @@ format: > And Bakery's done— > > Now I sip my coffee, lazy. +> +> -- Claude Sonnet 4.5 ## The Ecosystem at a Glance {.smaller} @@ -27,12 +29,12 @@ format: | Repository | Images | |:-----------|:-------| +| [images](https://github.com/posit-dev/images) | Meta repo, design principles, GitHub Discussions | | [images-connect](https://github.com/posit-dev/images-connect) | `connect`, `connect-content`, `connect-content-init` | | [images-package-manager](https://github.com/posit-dev/images-package-manager) | `package-manager` | | [images-workbench](https://github.com/posit-dev/images-workbench) | `workbench`, `workbench-session`, `workbench-session-init` | | [images-shared](https://github.com/posit-dev/images-shared) | `bakery` CLI, shared CI workflows & Actions | | [images-examples](https://github.com/posit-dev/images-examples) | Tutorials & extending examples | -| [images](https://github.com/posit-dev/images) | Meta repo & docs | Each product repo is independent -- one `bakery.yaml`, static Containerfiles, own CI. @@ -79,7 +81,9 @@ Each image ships with use-case-specific variants: **Standard** = runs out of the box. -**Minimal** = [extend](https://github.com/posit-dev/images-examples/tree/main/extending) with what you need. [Variant config docs](https://github.com/posit-dev/images-shared/blob/main/posit-bakery/CONFIGURATION.md#imagevariant) +**Minimal** = [extend](https://github.com/posit-dev/images-examples/tree/main/extending) with what you need. + +[Image Variant docs](https://github.com/posit-dev/images-shared/blob/main/posit-bakery/CONFIGURATION.md#imagevariant) ## Image Matrices {.smaller} @@ -95,9 +99,21 @@ matrix: constraint: { min: "3.11", latest: true } ``` -Versions resolve dynamically from external APIs (uv, Posit CDN, quarto.org). +[Constraints](https://github.com/posit-dev/images-shared/blob/main/posit-bakery/CONFIGURATION.md#dependencyconstraint) dynamically resolve explicit [versions](https://github.com/posit-dev/images-shared/blob/main/posit-bakery/CONFIGURATION.md#dependencyversions) from external sources (uv, Posit CDN, quarto.org). + +Versions can also be specified explicitly: + +```yaml +matrix: + namePattern: "R{{ Dependencies.R }}-python{{ Dependencies.python }}" + dependencies: + - dependency: R + versions: ["4.5.2", "4.4.3", "4.3.3"] + - dependency: python + versions: ["3.14.3", "3.13.12", "3.12.12", "3.11.14"] +``` -Used by `connect-content` and `workbench-session` — [config docs](https://github.com/posit-dev/images-shared/blob/main/posit-bakery/CONFIGURATION.md) | [example](https://github.com/posit-dev/images-examples/tree/main/bakery/06-matrix-images) +Used by `connect-content` and `workbench-session` — [matrix docs](https://github.com/posit-dev/images-shared/blob/main/posit-bakery/CONFIGURATION.md#imagematrix) | [example](https://github.com/posit-dev/images-examples/tree/main/bakery/06-matrix-images) ## How Bakery Works {.smaller} @@ -116,8 +132,9 @@ Used by `connect-content` and `workbench-session` — [config docs](https://gith **[Build](https://github.com/posit-dev/images-shared/blob/main/posit-bakery/ARCHITECTURE.md)** -* Generates Buildx Bake plan (JSON) -* Parallel target builds +* Multiple build strategies + * Parallel builds from a Buildx Bake plan (JSON) + * Sequential builds with docker or builders like podman/buildah * Registry-based layer caching * Automatic tag generation @@ -145,16 +162,18 @@ Published to **[Docker Hub](https://hub.docker.com/u/posit)** (`docker.io/posit/ | `` | `2026.01.1` | | `latest` | Latest primary variant + primary OS | +[Tag pattern docs](https://github.com/posit-dev/images-shared/blob/main/posit-bakery/CONFIGURATION.md#tagpattern) + Short tags (without `-std`/`-min`) resolve to the **primary** variant. -Preview/daily builds push under `*-preview` names. [Tag pattern config](https://github.com/posit-dev/images-shared/blob/main/posit-bakery/CONFIGURATION.md#tagpattern) +Preview/daily builds push under `*-preview` names. ## CI Workflows {.smaller} Shared workflow patterns in `images-shared` ([CI docs](https://github.com/posit-dev/images-shared/blob/main/CI.md)): | Workflow | Method | -|:---------|:-------| +|:-----|:-------| | `bakery-build-native.yml` | Native ARM + AMD runners, merge manifests | | `bakery-build.yml` | QEMU emulation | @@ -165,19 +184,23 @@ Both support: * **Weekly rebuilds** for OS security patches * **Registry cleanup** -- purge dangling caches and temp images -## Extending Minimal Images +## Extending Images {.smaller} + +[images-examples](https://github.com/posit-dev/images-examples) provides patterns for extending Minimal images and tutorials for Bakery. + +**[Extending](https://github.com/posit-dev/images-examples/tree/main/extending)** + +Plain Containerfiles that layer onto Minimal images: -Patterns for extending Minimal images ([`images-examples`](https://github.com/posit-dev/images-examples/tree/main/extending)): +* Custom CA certificates and pip configuration +* Python and R version installation with package lists +* System dependencies for additional libraries -| Example | Description | -|:--------|:------------| -| CA certificates | Custom CA certs | -| Python / R | Language versions | -| System dependencies | System libraries | -| pip.conf | Custom pip config | -| VS Code extensions | Pre-installed extensions | +**[Bakery](https://github.com/posit-dev/images-examples/tree/main/bakery)** -[Bakery examples](https://github.com/posit-dev/images-examples/tree/main/bakery): single-image builds through matrix configurations. +* A progressive tutorial starting from a single image build +* Shows adding multiple versions, variants, and OS targets +* Demonstrates managed dependencies and matrix images ## What's Next {.smaller} @@ -193,4 +216,4 @@ Patterns for extending Minimal images ([`images-examples`](https://github.com/po | Workbench ARM images | Multi-platform images for Workbench | | Image security scans | Scanning as quality gate before push | -[Questions & feedback](https://github.com/posit-dev/images/discussions) +Feedback & questions: [GitHub Discussions](https://github.com/posit-dev/images/discussions) | `#platform-images`