Skip to content

PENG-1896: Upgrade Docker base image to Debian trixie - #49

Open
william-kurosawa-clio wants to merge 2 commits into
mainfrom
peng-1896-debian-trixie
Open

PENG-1896: Upgrade Docker base image to Debian trixie#49
william-kurosawa-clio wants to merge 2 commits into
mainfrom
peng-1896-debian-trixie

Conversation

@william-kurosawa-clio

@william-kurosawa-clio william-kurosawa-clio commented Aug 6, 2026

Copy link
Copy Markdown

PENG-1896

What

  • Dockerfile: ruby:3.1.6-bullseyeruby:3.3.12-trixie.
  • .ruby-version and docs/manual_setup.md bumped to 3.3.12 so the manual (rbenv/asdf) path matches the Docker one.

Why

  • Bullseye base image is EOL (last rebuild 2025-03-18).
  • Ruby had to move with it: Docker Hub publishes no trixie variant for any 3.1.x.
  • Not 3.2.11-trixie (first revision of this PR): Ruby 3.2 hit EOL 2026-03-31, so that tag is frozen too — same problem again.
  • Not 3.4: it moves mutex_m to a bundled gem, and Rails 7.0's ActiveSupport requires it without declaring it. Hard LoadError, and 7.0 is out of maintenance. Needs a Rails upgrade first.
  • 3.3.12-trixie is supported until 2027-03-31.

Testing

No CI in this repo (Cycode only), so local verification is the only gate. Built and compared both bases:

  • nokogiri 1.13.10 (oldest native ext in the lockfile, main risk of the two-minor jump) compiles.
  • bundle check satisfied; Rails 7.0.8.4 boots; GET / returns identical 200 (1972 bytes).
  • rubocop: same 4 pre-existing offenses.
  • Debian 13 / Ruby 3.3.12, apt nodejs v20, OpenSSL 3.5.6.

OpenSSL 1.1.1 → 3.x: app crypto is cookies.encrypted (Rails AES-GCM), verified JWT.decode, and outbound TLS via http — none use legacy-provider algorithms. Node is only an ExecJS runtime for uglifier/coffee-rails.

Not verified: OAuth/SSO end-to-end against Identity/Manage (needs real credentials), and linux/amd64 for 3.3.12 specifically (the 3.2.11 round matched on both arches).

Notes

Pre-existing, not fixed here:

  • Test suite can't pass on main either — test/test_helper.rb calls fixtures :all with no ActiveRecord.
  • Spring is misconfigured for test (cache_classes must be false). Used DISABLE_SPRING=1 at runtime only; nothing committed.
  • Dockerfile pins bundler:2.2.21 vs BUNDLED WITH 2.4.20 (self-corrects at install).
  • scripts/entrypoint.sh cleans /myapp/tmp/pids/server.pid but WORKDIR is /Switchboard — no-op. It also appends to .env, a tracked file, so check git status after docker-compose up.

🤖 Generated with Claude Code

william-kurosawa-clio and others added 2 commits August 6, 2026 16:41
Debian bullseye reaches end of life; move the container base to trixie.

The official `ruby` Docker Hub images have no trixie variant for any 3.1.x
release (3.1 is EOL and no longer rebuilt), so the smallest possible move is
to the newest patch of the next minor line: ruby:3.2.11-trixie. `.ruby-version`
and the manual setup doc are updated to match so local and Docker setups stay
in sync for external readers of this sample app.

Verified by building both the old and new images and running rubocop, a Rails
boot check, the test task and an HTTP smoke test of the running server against
each, on arm64 and amd64 — behaviour is identical.

PENG-1896

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
Review caught that 3.2.11-trixie is the wrong landing spot. Ruby 3.2
reached EOL on 2026-03-31, so Docker stopped rebuilding that tag: it was
last pushed 2026-04-14 and there is no 3.2.12 to move to. Picking it
would have swapped one unpatched base image for another and booked a
repeat of this ticket.

  ruby:3.2.11-trixie   last pushed 2026-04-14  (EOL, frozen)
  ruby:3.3.12-trixie   last pushed 2026-08-05  (supported to 2027-03-31)

3.3 rather than 3.4 because Ruby 3.4 moved mutex_m, base64 and bigdecimal
from default to bundled gems, and Rails 7.0's ActiveSupport requires
mutex_m without declaring it — a hard LoadError under Bundler that Rails
7.0 will never be patched for.

Verified on 3.3.12: nokogiri 1.13.10 (Oct 2022, the oldest native
extension in the lockfile) compiles, bundle check passes, rubocop reports
the same 4 pre-existing offenses, Rails boots 7.0.8.4, and GET / returns
200 with 1972 bytes and the same title as on bullseye.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
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