Skip to content

Move the almanack image off end-of-life Debian bullseye - #69

Merged
aditigopalan merged 2 commits into
mainfrom
fix-almanack-base-image
Sep 16, 2026
Merged

aditigopalan merged 2 commits into
mainfrom
fix-almanack-base-image

Conversation

@aditigopalan

@aditigopalan aditigopalan commented Sep 15, 2026 •

Copy link
Copy Markdown
Collaborator

What was broken

docker/almanack/Dockerfile could not be built. apt-get install returned 404s for perl-base, git-man and libexpat1: Debian bullseye reached end of life, and its security pool stopped carrying the package versions that its own package index still references.

This is not a regression from anything recent. I built the current main Dockerfile locally and got the identical failure, so Dependabot PR #67 (which bumps the same base image) did not cause it and does not fix it either.

It went unnoticed because .github/workflows/docker_almanack.yml only triggers on changes to the Dockerfile or to itself. Nothing rebuilds the image on a schedule, so base-image decay is invisible until someone touches the file.

The change

python:3.11-slim-bullseye to python:3.13-slim-trixie.

Both 3.13-slim-bookworm and 3.13-slim-trixie build clean. Trixie has the longer support window, so picking it buys more time before this recurs. Only Almanack runs in this image, so the Python version answers to Almanack alone and is independent of the 3.11 the pipeline's other processes use.

Verification

Built the image, then ran Almanack end to end inside it against a checkout of this repo:

  • Python 3.13.15, almanack 0.1.17
  • 100 metrics returned
  • repo-almanack-score 0.727 (8 of 11)

Follow-ups, not in this PR

  • The image installs almanack unpinned, so which version produced a given cohort's data depends on when the image happened to be built. Worth pinning for the manuscript's reproducibility story.
  • Adding a schedule: trigger to docker_almanack.yml would catch the next round of base-image rot rather than waiting for someone to edit the Dockerfile.

Closes #67 as superseded.

Why Dependabot did not prevent this

The docker ecosystem is already configured in .github/dependabot.yml against /docker/almanack, and #67 is its output. It cannot catch this class of problem: Dependabot treats the distro suffix in the tag as a variant to preserve, so it proposed 3.11-slim-bullseye to 3.13-slim-bullseye, moving the Python version while keeping the end-of-life distro. That PR's build check fails for the same 404s as main. Nothing short of a scheduled rebuild will surface base-image decay here.

The bullseye security pool stopped carrying the package versions that its own
package index still references, so apt-get install failed with 404s on
perl-base, git-man and libexpat1 and the image could not be built at all. The
build workflow only triggers on changes to the Dockerfile or to itself, so this
went unnoticed for months.

Verified by building the image and running almanack end to end inside it:
python 3.13.15, almanack 0.1.17, 100 metrics, score 0.727.
@aditigopalan
aditigopalan requested a review from d33bs September 15, 2026 18:31

@d33bs d33bs left a comment

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Nice catch! Optionally, consider setting up Dependabot to check for these kinds of things - I think this might have been triggered prior to running into it (https://docs.github.com/en/code-security/reference/supply-chain-security/supported-ecosystems-and-repositories#docker).

Comment thread docker/almanack/Dockerfile Outdated
Comment thread docker/almanack/Dockerfile Outdated
The base-image rationale belongs in the pull request description, not in the
file, and the surviving comment no longer names specific Python versions so it
does not go stale the next time either version moves.
@aditigopalan
aditigopalan merged commit dc0cd32 into main Sep 16, 2026
2 checks passed
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants