#33 — Docker Development Container #33
Labels
No labels
priority/could
priority/must
priority/should
priority/wont
status/blocked
status/claimed
status/done-migrated
type/bug
type/feature
type/infra
type/tech-debt
No milestone
No project
No assignees
1 participant
Notifications
Due date
No due date set.
Dependencies
No dependencies set
Reference
robert/todo#33
Loading…
Reference in a new issue
No description provided.
Delete branch "%!s()"
Deleting a branch is permanent. Although the deleted branch may continue to exist for a short time before it actually gets removed, it CANNOT be undone in most cases. Continue?
Story
#33: Docker Development ContainerAs a developer (human or AI agent),
I want to run the entire development environment inside a Docker container,
so that I can build, run, test, and screenshot the application without any local tooling installed on the host.
Background
Today, development requires the host to have .NET 10 SDK, Node.js 22, PostgreSQL, Redis, and Playwright browsers installed separately. This makes onboarding slow and prevents AI agents (Claude Code) from developing autonomously in a clean, reproducible environment. A self-contained dev container solves both problems.
Acceptance criteria
docker compose -f docker-compose.dev.yml up -dstarts the full dev environment (app container + PostgreSQL + Redis)dotnet buildanddotnet testsucceed inside the containernpm run build,npm test, andnpx playwright testsucceed inside the containerclaude) is available inside the container and can be launched by passingANTHROPIC_API_KEYvia environment variable.env.dev.exampledocuments the required environment variables for the dev setupdocs/dev-container.mdexplains how to start the container, run services, execute tests, and take screenshotsFiles to be created / changed
Dockerfile.devdocker-compose.dev.yml.env.dev.exampledocs/dev-container.mdExisting
Dockerfileanddocker-compose.ymlare not modified — they remain for production deployments.Technical design notes for Architect
Base image
Use
mcr.microsoft.com/dotnet/sdk:10.0(Debian-based) as the base — it already includes the .NET SDK and is glibc-based, which Playwright requires.Tool layers (order matters for layer caching)
curl,git,unzip,gnupg,ca-certificates,libgssapi-krb5-2(for .NET),libicu-devnpm install -g @anthropic-ai/claude-code— installs theclaudeCLInpx playwright install-deps chromiumrequires root; run during image buildnpx playwright install chromiumPlaywright headless screenshots
Playwright headless Chromium does not require a display server (no Xvfb). Set
PLAYWRIGHT_BROWSERS_PATH=/ms-playwrightand install at build time so the browser is baked into the image.Port exposure
Environment variables required at runtime
Bind mount strategy
Mount the project root to
/workspaceinside the container. The working directory for all commands is/workspace. This preserves the host's git history and allows IDE tools on the host to keep working.Out of scope
Dockerfiletoday)Usage guide (draft — final version goes in
docs/dev-container.md)Prerequisites
First-time setup
Daily development
Autonomous AI agent mode
Taking a screenshot
Claude Code can use Playwright inside the container to capture the UI:
Stopping
Data is stored in a named Docker volume (
todo_dev_postgres) and persists across restarts. To reset the database:docker compose -f docker-compose.dev.yml down -v.