1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
{
"name": "Rust Development",
"build": {
"dockerfile": "Dockerfile",
"context": ".."
},
// Allow the container to use more memory for heavy link steps (cargo-llvm-cov)
"runArgs": ["--memory=32g", "--memory-swap=40g"],
// provreq serve reads its operator-level System config from here. It lives on the persistent
// /workspace mount (NOT container HOME, which a rebuild wipes) so the LLM provider you add in the
// UI — and its API key — survives a rebuild. As of provreq v0.0.13 the UI bootstraps the file on
// first "add provider"; `.provreq/` is gitignored because it holds those keys.
"containerEnv": {
"PROVREQ_SYSTEM_CONFIG": "/workspace/.provreq/system.json",
// provreq's category-3 (UI) verification drives a W3C WebDriver grid; it probes GET
// <WEBDRIVER_URL>/status. host.docker.internal:4444 reaches a Selenium grid published on the
// host's :4444 (e.g. a `selenium-chrome` container) — localhost and container names don't
// resolve on the default bridge, and the grid's container IP is unstable across restarts.
// No grid running there is fine: provreq just reports the engine MISSING until one is.
"WEBDRIVER_URL": "http://host.docker.internal:4444"
},
// Enable Docker-in-Docker.
// Pinned to v3 with "moby": false: the base image is Ubuntu 26.04 ("resolute"),
// which the Moby (packages.microsoft.com) path does not support. v3's Docker CE
// path does publish a resolute apt repo, so installing Docker CE is what works here.
"features": {
"ghcr.io/devcontainers/features/docker-in-docker:3": {
"moby": false
}
},
// Configure tool-specific properties
"customizations": {
"vscode": {
// Extensions to install in the container
"extensions": [
"rust-lang.rust-analyzer",
"vadimcn.vscode-lldb",
"dunstontc.vscode-docker-syntax",
"chanhx.crabviz",
"jeff-hykin.better-dockerfile-syntax",
"ms-vscode-remote.remote-containers",
"kennylong.kubernetes-yaml-formatter",
"ms-azuretools.vscode-containers",
"fill-labs.dependi",
"p1c2u.docker-compose",
"formulahendry.docker-explorer",
"formulahendry.docker-extension-pack",
"QuentinGruber.dockerfiletemplate",
"tamasfe.even-better-toml",
"ms-vscode.makefile-tools",
"yzhang.markdown-all-in-one",
"TakumiI.markdowntable",
"MarcusElg.markdowntoolbar",
"DavidAnson.vscode-markdownlint",
"esbenp.prettier-vscode",
"bodil.prettier-toml",
"Gruntfuggly.todo-tree",
"ms-vscode.vscode-websearchforcopilot",
"redhat.vscode-yaml",
"jock.svg",
"SimonSiefke.svg-preview",
"ms-python.isort",
"donjayamanne.python-extension-pack",
"498-00.pythonformat",
"mechatroner.rainbow-csv",
"ms-vscode.cpptools",
"ms-python.autopep8",
"Anthropic.claude-code"
]
}
},
// Forward ports if needed (adjust as necessary)
"forwardPorts": [
3000,
6784,
17867,
8000,
1880,
17869
],
"portsAttributes": {
"17869": {
"label": "provreq UI",
"onAutoForward": "notify"
},
"17867": {
"label": "doorstop-server"
}
},
// Mount your workspace
"workspaceMount": "source=${localWorkspaceFolder},target=/workspace,type=bind",
"workspaceFolder": "/workspace",
// Mount Docker socket for Docker-in-Docker
"mounts": [
"source=/var/run/docker.sock,target=/var/run/docker.sock,type=bind",
"source=/etc/secrets,target=/etc/secrets,type=bind",
// Share local .claude-home with container
"source=${localWorkspaceFolder}/.claude-home,target=/root/.claude,type=bind"
],
// Keep container running
"shutdownAction": "stopContainer",
// Optional: Run commands after container creation
"postCreateCommand": "rustc --version && cargo --version && python3 --version && node --version && npm --version && cargo llvm-cov --version && provreq --version && glab --version && cargo kani --version && make setup-hooks"
}