Skip to content

Modernize devcontainer: Dockerfile-only build with mise-managed tools - #39

Merged
bmorton merged 6 commits into
mainfrom
bmorton/mise-modernize
Oct 30, 2026
Merged

bmorton merged 6 commits into
mainfrom
bmorton/mise-modernize

Conversation

@bmorton

@bmorton bmorton commented Oct 30, 2026

Copy link
Copy Markdown
Owner

Why

Two things at once: bring every dependency up to date, and make the image reproducible by envbuilder's cache probe. Devcontainer features can't be reproduced by the probe (coder/terraform-provider-envbuilder#68, as researched in #32), so this removes all of them and installs everything from the Dockerfile, with versions centralised in .devcontainer/mise.toml.

What changed

  • Base image → typescript-node:26-trixie (Node 26 LTS, Debian 13).
  • mise (pinned binary from ghcr.io/jdx/mise:2026.10.23) installs every versioned tool system-wide from mise.toml → /etc/mise/config.toml; shims are on PATH for all shells, no mise activate needed. Go 1.27.3, Ruby 4.0.9, Rust 1.99.1, kubectl 1.37.2, helm 4.3.1, minikube, gh, az, golangci-lint, staticcheck, gopls, dlv, govulncheck, Claude Code, Copilot CLI, opencode, pi, tmux 3.7c.
  • Dockerfile keeps apt packages, sshd (2222, started by postStartCommand), nsc, Playwright, tmux config, and chowns /workspaces to node (from Fix /workspaces permissions so the node user can clone repos #30).
  • tmux.conf modernised (bindings unchanged): tmux-256color, allow-passthrough (all on 3.4+), focus-events, extended-keys, set-clipboard, escape-time 10, 50k history. This is what makes Claude Code notifications, the progress bar, Shift+Enter and Esc work inside tmux under iTerm2.
  • Automation: new weekly Bump mise tools workflow (mise upgrade --bump → PR) replaces Dependabot's devcontainers ecosystem; actions/checkout → v7 (supersedes Bump actions/checkout from 6 to 7 #27).
  • Removed: @openprose/prose-cli, devcontainer-lock.json, all features.
  • verify-devcontainer.sh additionally asserts /workspaces is writable and every mise tool is installed and runs via shim.

Validation

  • Full mise install of this exact mise.toml was exercised in the current container (all tools resolve and run; rust needs the writable homes the Dockerfile now creates).
  • tmux.conf verified to load on tmux 3.3a (current container) and 3.7c (new image).
  • No Docker in my environment, so Build Containers CI is the real test for the Dockerfile.

Supersedes #32, #30, #27, #34, #35, #37.

🤖 Generated with Claude Code

https://claude.ai/code/session_01AihTX41wWUjfBk3c2A9h2Z

bmorton and others added 3 commits October 30, 2026 06:16
Replace every devcontainer feature with plain Dockerfile layers and move all
versioned tools into .devcontainer/mise.toml, installed system-wide with mise.
A feature-free image is what lets Coder's envbuilder cache probe match the
prebuilt image and boot workspaces without rebuilding (see PR #32).

- Base image: typescript-node 26-trixie (Node 26 LTS, Debian 13).
- mise.toml pins Go 1.27.3, Ruby 4.0.9, Rust 1.99.1, kubectl/helm/minikube,
  gh, az, golangci-lint/staticcheck/gopls/dlv/govulncheck, Claude Code,
  Copilot CLI, opencode, pi, and tmux 3.7c (official static build).
- Shims dir, GOPATH, CARGO_HOME, RUSTUP_HOME are system-wide and node-owned so
  tools work in non-interactive shells and survive a persisted home.
- sshd (2222) and /workspaces ownership handled in the Dockerfile (from #30).
- Drop @openprose/prose-cli (no longer needed) and devcontainer-lock.json.
- tmux.conf: tmux-256color, allow-passthrough (all on 3.4+), focus-events,
  extended-keys, set-clipboard, escape-time 10, bigger history. Key bindings
  unchanged. Fixes Claude Code notifications/Shift+Enter/Esc inside tmux.
- New weekly "Bump mise tools" workflow (mise upgrade --bump) replaces the
  Dependabot devcontainers ecosystem; actions/checkout bumped to v7.
- verify-devcontainer.sh also checks /workspaces is writable and that every
  mise tool is installed and runnable via shims.

Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01AihTX41wWUjfBk3c2A9h2Z
kaniko (envbuilder) denies the non-root user write access to /dev/stderr, so
the build failed after a fully successful mise install. Use a plain shell
test instead.

Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01AihTX41wWUjfBk3c2A9h2Z
Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01AihTX41wWUjfBk3c2A9h2Z
bmorton and others added 3 commits October 30, 2026 06:25
go, kubectl, helm, tmux and gopls do not accept --version, which made the
new shim check report false failures on an otherwise good build.

Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01AihTX41wWUjfBk3c2A9h2Z
Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01AihTX41wWUjfBk3c2A9h2Z
@bmorton
bmorton merged commit 2af18d1 into main Oct 30, 2026
3 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.

1 participant