Collapse base/dev/student into one image: ghcr.io/ppbds/devcontainer#17
Merged
Conversation
One Dockerfile at the repo root, one CI job, one release train. The dev image's delta over base (qpdf + devtools/pkgdown/roxygen2/testthat/ usethis) was trivial against the ~4.6 GB full image, its only consumer was PPBDS/primer, and the base->downstream split cost BASE_TAG plumbing, a two-job CI dependency, and cross-image permission bugs (the 2026-07 lock-file failure happened exactly at that boundary). Content changes beyond concatenation: - qpdf joins the main apt list; dev's R packages install as rstudio (retiring dev's root-install + chmod pattern) - PKG_SYSREQS=false placed after the root-installed R stacks, before all rstudio-user installs, and now applies image-wide at runtime - requirements.txt/.lock move to the repo root; .dockerignore added - CLAUDE.md and README rewritten for the one-image architecture Old GHCR packages (devcontainers/base, /dev, /student) keep their final tags but receive no new versions. Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
There was a problem hiding this comment.
Pull request overview
This PR consolidates the prior base/dev/student image split into a single root Dockerfile that builds and publishes one GHCR image (ghcr.io/ppbds/devcontainer), simplifying CI, tagging, and consumer configuration while preserving the existing tool stacks and smoke tests.
Changes:
- Replaces the three per-audience Dockerfiles with one root
Dockerfile, moving Python requirements files to the repo root. - Simplifies GitHub Actions build/push to a single job targeting
ghcr.io/ppbds/devcontainer. - Updates repository documentation (README + CLAUDE.md) to reflect the new one-image architecture and rollout/runbook.
Reviewed changes
Copilot reviewed 8 out of 10 changed files in this pull request and generated 1 comment.
Show a summary per file
| File | Description |
|---|---|
| Dockerfile | New single-image build that merges base/dev/student layers, installs stacks, and runs smoke tests. |
| .github/workflows/build.yml | Collapses the previous multi-job pipeline into a single build-and-push job for the root image. |
| requirements.txt | New root-level top-pin list for the Python data-science stack. |
| requirements.lock | New root-level uv-compiled lockfile for the Python stack. |
| .dockerignore | Minimizes build context to only the Dockerfile + Python requirements files. |
| README.md | Updates consumption instructions to the new ghcr.io/ppbds/devcontainer image and explains deprecation of old images. |
| CLAUDE.md | Updates architecture/runbook guidance for the single-image approach and associated conventions. |
| base/Dockerfile | Removed (functionality moved into root Dockerfile). |
| dev/Dockerfile | Removed (functionality moved into root Dockerfile). |
| student/Dockerfile | Removed (functionality moved into root Dockerfile). |
💡 Add Copilot custom instructions for smarter, more guided reviews. Learn how to get started.
Comment on lines
+489
to
+493
| # (c) The course tutorials must be discoverable (catches a broken tutorial pkg). | ||
| RUN R --vanilla -e 'ts <- learnr::available_tutorials("tutorial.helpers"); if (!("getting-started" %in% ts$name)) stop("getting-started tutorial not found"); cat("TUTORIALS OK:", paste(ts$name, collapse = ", "), "\n")' | ||
| # ───────────────────────────────────────────────────────────────────────────── | ||
|
|
||
| # Locale (en_US.UTF-8) and timezone (Etc/UTC) are inherited from the rocker base. |
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
One Dockerfile at the repo root, one CI job, one release train, one image name:
Why: dev's delta over base was qpdf + five R packages (trivial vs the ~4.6 GB image) with one consumer; the base→downstream split cost BASE_TAG plumbing, a two-job CI dependency, and cross-image permission bugs (the 2026-07 lock-file failure happened exactly at that boundary).
Beyond concatenation:
PKG_SYSREQS=falsenow applies image-wide (it was student-only)Rollout: old GHCR packages keep their final tags (existing pins unaffected) but get no new versions. Follow-ups after v1.0.0: repin codespace-starter, and pin PPBDS/primer (per David — no more
:latestthere).Validation build green (all smoke tests incl. brms/Stan + catboost e2e): https://github.com/PPBDS/devcontainers/actions/runs/28882966938
New package confirmed publicly pullable (anonymous manifest GET → 200).
🤖 Generated with Claude Code