container-superposition 0.1.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +843 -0
- package/dist/scripts/init.d.ts +3 -0
- package/dist/scripts/init.d.ts.map +1 -0
- package/dist/scripts/init.js +1190 -0
- package/dist/scripts/init.js.map +1 -0
- package/dist/scripts/migrate-to-manifests.d.ts +12 -0
- package/dist/scripts/migrate-to-manifests.d.ts.map +1 -0
- package/dist/scripts/migrate-to-manifests.js +230 -0
- package/dist/scripts/migrate-to-manifests.js.map +1 -0
- package/dist/tool/questionnaire/composer.d.ts +6 -0
- package/dist/tool/questionnaire/composer.d.ts.map +1 -0
- package/dist/tool/questionnaire/composer.js +1232 -0
- package/dist/tool/questionnaire/composer.js.map +1 -0
- package/dist/tool/readme/markdown-parser.d.ts +30 -0
- package/dist/tool/readme/markdown-parser.d.ts.map +1 -0
- package/dist/tool/readme/markdown-parser.js +139 -0
- package/dist/tool/readme/markdown-parser.js.map +1 -0
- package/dist/tool/readme/readme-generator.d.ts +9 -0
- package/dist/tool/readme/readme-generator.d.ts.map +1 -0
- package/dist/tool/readme/readme-generator.js +422 -0
- package/dist/tool/readme/readme-generator.js.map +1 -0
- package/dist/tool/schema/custom-loader.d.ts +17 -0
- package/dist/tool/schema/custom-loader.d.ts.map +1 -0
- package/dist/tool/schema/custom-loader.js +149 -0
- package/dist/tool/schema/custom-loader.js.map +1 -0
- package/dist/tool/schema/overlay-loader.d.ts +47 -0
- package/dist/tool/schema/overlay-loader.d.ts.map +1 -0
- package/dist/tool/schema/overlay-loader.js +252 -0
- package/dist/tool/schema/overlay-loader.js.map +1 -0
- package/dist/tool/schema/types.d.ts +212 -0
- package/dist/tool/schema/types.d.ts.map +1 -0
- package/dist/tool/schema/types.js +5 -0
- package/dist/tool/schema/types.js.map +1 -0
- package/docs/README.md +308 -0
- package/docs/architecture.md +233 -0
- package/docs/creating-overlays.md +549 -0
- package/docs/custom-patches.md +540 -0
- package/docs/dependencies.md +279 -0
- package/docs/examples/custom-patches-example.md +85 -0
- package/docs/examples.md +576 -0
- package/docs/messaging-comparison.md +265 -0
- package/docs/messaging-quick-start.md +385 -0
- package/docs/observability-workflow.md +537 -0
- package/docs/overlay-manifest-refactoring.md +214 -0
- package/docs/overlay-metadata-archive.md +54 -0
- package/docs/overlays.md +523 -0
- package/docs/presets-architecture.md +498 -0
- package/docs/presets.md +366 -0
- package/docs/publishing.md +476 -0
- package/docs/quick-reference.md +326 -0
- package/docs/ux.md +170 -0
- package/features/README.md +85 -0
- package/features/cross-distro-packages/README.md +146 -0
- package/features/cross-distro-packages/devcontainer-feature.json +20 -0
- package/features/cross-distro-packages/install.sh +58 -0
- package/features/local-secrets-manager/devcontainer-feature.json +18 -0
- package/features/local-secrets-manager/install.sh +127 -0
- package/features/project-scaffolder/devcontainer-feature.json +24 -0
- package/features/project-scaffolder/install.sh +100 -0
- package/features/team-conventions/devcontainer-feature.json +24 -0
- package/features/team-conventions/install.sh +93 -0
- package/overlays/.registry/README.md +14 -0
- package/overlays/.registry/base-images.yml +26 -0
- package/overlays/.registry/base-templates.yml +7 -0
- package/overlays/README.md +155 -0
- package/overlays/alertmanager/.env.example +5 -0
- package/overlays/alertmanager/README.md +465 -0
- package/overlays/alertmanager/alert-rules.yml +56 -0
- package/overlays/alertmanager/alertmanager.yml +42 -0
- package/overlays/alertmanager/devcontainer.patch.json +12 -0
- package/overlays/alertmanager/docker-compose.yml +20 -0
- package/overlays/alertmanager/overlay.yml +17 -0
- package/overlays/alertmanager/setup.sh +53 -0
- package/overlays/alertmanager/verify.sh +31 -0
- package/overlays/aws-cli/README.md +473 -0
- package/overlays/aws-cli/devcontainer.patch.json +13 -0
- package/overlays/aws-cli/overlay.yml +13 -0
- package/overlays/azure-cli/README.md +551 -0
- package/overlays/azure-cli/devcontainer.patch.json +8 -0
- package/overlays/azure-cli/overlay.yml +13 -0
- package/overlays/bun/README.md +312 -0
- package/overlays/bun/devcontainer.patch.json +41 -0
- package/overlays/bun/overlay.yml +16 -0
- package/overlays/bun/setup.sh +79 -0
- package/overlays/bun/verify.sh +30 -0
- package/overlays/codex/README.md +128 -0
- package/overlays/codex/devcontainer.patch.json +3 -0
- package/overlays/codex/overlay.yml +14 -0
- package/overlays/codex/setup.sh +24 -0
- package/overlays/codex/verify.sh +30 -0
- package/overlays/commitlint/README.md +333 -0
- package/overlays/commitlint/devcontainer.patch.json +8 -0
- package/overlays/commitlint/overlay.yml +16 -0
- package/overlays/commitlint/setup.sh +234 -0
- package/overlays/direnv/README.md +504 -0
- package/overlays/direnv/devcontainer.patch.json +6 -0
- package/overlays/direnv/overlay.yml +13 -0
- package/overlays/direnv/setup.sh +139 -0
- package/overlays/docker-in-docker/README.md +534 -0
- package/overlays/docker-in-docker/devcontainer.patch.json +10 -0
- package/overlays/docker-in-docker/overlay.yml +13 -0
- package/overlays/docker-sock/README.md +256 -0
- package/overlays/docker-sock/devcontainer.patch.json +9 -0
- package/overlays/docker-sock/docker-compose.yml +8 -0
- package/overlays/docker-sock/overlay.yml +13 -0
- package/overlays/dotnet/README.md +147 -0
- package/overlays/dotnet/devcontainer.patch.json +51 -0
- package/overlays/dotnet/global-tools.txt +24 -0
- package/overlays/dotnet/overlay.yml +13 -0
- package/overlays/dotnet/setup.sh +51 -0
- package/overlays/dotnet/verify.sh +26 -0
- package/overlays/gcloud/README.md +269 -0
- package/overlays/gcloud/devcontainer.patch.json +14 -0
- package/overlays/gcloud/overlay.yml +14 -0
- package/overlays/gcloud/verify.sh +52 -0
- package/overlays/git-helpers/README.md +168 -0
- package/overlays/git-helpers/devcontainer.patch.json +33 -0
- package/overlays/git-helpers/overlay.yml +15 -0
- package/overlays/git-helpers/setup.sh +91 -0
- package/overlays/go/README.md +293 -0
- package/overlays/go/devcontainer.patch.json +43 -0
- package/overlays/go/overlay.yml +15 -0
- package/overlays/go/setup.sh +33 -0
- package/overlays/go/verify.sh +40 -0
- package/overlays/grafana/.env.example +9 -0
- package/overlays/grafana/README.md +462 -0
- package/overlays/grafana/dashboard-provider.yml +11 -0
- package/overlays/grafana/dashboards/observability-overview.json +263 -0
- package/overlays/grafana/devcontainer.patch.json +12 -0
- package/overlays/grafana/docker-compose.yml +27 -0
- package/overlays/grafana/grafana-datasources.yml +57 -0
- package/overlays/grafana/overlay.yml +21 -0
- package/overlays/grafana/verify.sh +34 -0
- package/overlays/jaeger/.env.example +7 -0
- package/overlays/jaeger/README.md +867 -0
- package/overlays/jaeger/devcontainer.patch.json +12 -0
- package/overlays/jaeger/docker-compose.yml +17 -0
- package/overlays/jaeger/overlay.yml +19 -0
- package/overlays/java/README.md +267 -0
- package/overlays/java/devcontainer.patch.json +44 -0
- package/overlays/java/overlay.yml +16 -0
- package/overlays/java/setup.sh +41 -0
- package/overlays/java/verify.sh +42 -0
- package/overlays/just/README.md +443 -0
- package/overlays/just/devcontainer.patch.json +3 -0
- package/overlays/just/overlay.yml +13 -0
- package/overlays/just/setup.sh +182 -0
- package/overlays/kubectl-helm/README.md +660 -0
- package/overlays/kubectl-helm/devcontainer.patch.json +10 -0
- package/overlays/kubectl-helm/overlay.yml +13 -0
- package/overlays/loki/.env.example +5 -0
- package/overlays/loki/README.md +1156 -0
- package/overlays/loki/devcontainer.patch.json +12 -0
- package/overlays/loki/docker-compose.yml +18 -0
- package/overlays/loki/loki-config.yaml +45 -0
- package/overlays/loki/overlay.yml +17 -0
- package/overlays/minio/.env.example +9 -0
- package/overlays/minio/README.md +639 -0
- package/overlays/minio/devcontainer.patch.json +30 -0
- package/overlays/minio/docker-compose.yml +28 -0
- package/overlays/minio/overlay.yml +18 -0
- package/overlays/minio/setup.sh +61 -0
- package/overlays/minio/verify.sh +64 -0
- package/overlays/mkdocs/README.md +309 -0
- package/overlays/mkdocs/devcontainer.patch.json +24 -0
- package/overlays/mkdocs/overlay.yml +15 -0
- package/overlays/modern-cli-tools/README.md +556 -0
- package/overlays/modern-cli-tools/devcontainer.patch.json +3 -0
- package/overlays/modern-cli-tools/overlay.yml +13 -0
- package/overlays/modern-cli-tools/setup.sh +153 -0
- package/overlays/mongodb/.env.example +9 -0
- package/overlays/mongodb/README.md +481 -0
- package/overlays/mongodb/devcontainer.patch.json +32 -0
- package/overlays/mongodb/docker-compose.yml +44 -0
- package/overlays/mongodb/overlay.yml +17 -0
- package/overlays/mongodb/verify.sh +48 -0
- package/overlays/mysql/.env.example +11 -0
- package/overlays/mysql/README.md +542 -0
- package/overlays/mysql/devcontainer.patch.json +34 -0
- package/overlays/mysql/docker-compose.yml +55 -0
- package/overlays/mysql/overlay.yml +16 -0
- package/overlays/mysql/verify.sh +48 -0
- package/overlays/nats/.env.example +5 -0
- package/overlays/nats/README.md +762 -0
- package/overlays/nats/devcontainer.patch.json +24 -0
- package/overlays/nats/docker-compose.yml +31 -0
- package/overlays/nats/overlay.yml +18 -0
- package/overlays/nats/verify.sh +50 -0
- package/overlays/ngrok/README.md +503 -0
- package/overlays/ngrok/devcontainer.patch.json +3 -0
- package/overlays/ngrok/overlay.yml +14 -0
- package/overlays/ngrok/setup.sh +125 -0
- package/overlays/nodejs/README.md +192 -0
- package/overlays/nodejs/devcontainer.patch.json +49 -0
- package/overlays/nodejs/global-packages.txt +16 -0
- package/overlays/nodejs/overlay.yml +14 -0
- package/overlays/nodejs/setup.sh +46 -0
- package/overlays/nodejs/verify.sh +32 -0
- package/overlays/otel-collector/.env.example +9 -0
- package/overlays/otel-collector/README.md +1257 -0
- package/overlays/otel-collector/devcontainer.patch.json +28 -0
- package/overlays/otel-collector/docker-compose.yml +22 -0
- package/overlays/otel-collector/otel-collector-config.yaml +68 -0
- package/overlays/otel-collector/overlay.yml +21 -0
- package/overlays/otel-collector/setup.sh +49 -0
- package/overlays/otel-demo-nodejs/.env.example +2 -0
- package/overlays/otel-demo-nodejs/Dockerfile-otel-demo-nodejs +17 -0
- package/overlays/otel-demo-nodejs/README.md +409 -0
- package/overlays/otel-demo-nodejs/devcontainer.patch.json +12 -0
- package/overlays/otel-demo-nodejs/docker-compose.yml +19 -0
- package/overlays/otel-demo-nodejs/overlay.yml +23 -0
- package/overlays/otel-demo-nodejs/package-otel-demo-nodejs.json +20 -0
- package/overlays/otel-demo-nodejs/server-otel-demo-nodejs.js +259 -0
- package/overlays/otel-demo-nodejs/tracing-otel-demo-nodejs.js +57 -0
- package/overlays/otel-demo-nodejs/verify.sh +31 -0
- package/overlays/otel-demo-python/.env.example +2 -0
- package/overlays/otel-demo-python/Dockerfile-otel-demo-python +16 -0
- package/overlays/otel-demo-python/README.md +82 -0
- package/overlays/otel-demo-python/app-otel-demo-python.py +208 -0
- package/overlays/otel-demo-python/devcontainer.patch.json +12 -0
- package/overlays/otel-demo-python/docker-compose.yml +19 -0
- package/overlays/otel-demo-python/overlay.yml +23 -0
- package/overlays/otel-demo-python/requirements-otel-demo-python.txt +4 -0
- package/overlays/otel-demo-python/verify.sh +31 -0
- package/overlays/playwright/README.md +629 -0
- package/overlays/playwright/devcontainer.patch.json +9 -0
- package/overlays/playwright/overlay.yml +13 -0
- package/overlays/postgres/.env.example +6 -0
- package/overlays/postgres/README.md +602 -0
- package/overlays/postgres/devcontainer.patch.json +21 -0
- package/overlays/postgres/docker-compose.yml +22 -0
- package/overlays/postgres/overlay.yml +15 -0
- package/overlays/postgres/verify.sh +45 -0
- package/overlays/powershell/README.md +314 -0
- package/overlays/powershell/devcontainer.patch.json +22 -0
- package/overlays/powershell/overlay.yml +13 -0
- package/overlays/powershell/setup.sh +29 -0
- package/overlays/powershell/verify.sh +38 -0
- package/overlays/pre-commit/README.md +263 -0
- package/overlays/pre-commit/devcontainer.patch.json +9 -0
- package/overlays/pre-commit/overlay.yml +16 -0
- package/overlays/pre-commit/setup.sh +129 -0
- package/overlays/presets/docs-site.yml +118 -0
- package/overlays/presets/fullstack.yml +181 -0
- package/overlays/presets/microservice.yml +118 -0
- package/overlays/presets/web-api.yml +109 -0
- package/overlays/prometheus/.env.example +5 -0
- package/overlays/prometheus/README.md +1246 -0
- package/overlays/prometheus/devcontainer.patch.json +12 -0
- package/overlays/prometheus/docker-compose.yml +22 -0
- package/overlays/prometheus/overlay.yml +17 -0
- package/overlays/prometheus/prometheus.yml +12 -0
- package/overlays/prometheus/verify.sh +34 -0
- package/overlays/promtail/.env.example +2 -0
- package/overlays/promtail/README.md +357 -0
- package/overlays/promtail/devcontainer.patch.json +5 -0
- package/overlays/promtail/docker-compose.yml +16 -0
- package/overlays/promtail/overlay.yml +17 -0
- package/overlays/promtail/promtail-config.yaml +60 -0
- package/overlays/promtail/verify.sh +31 -0
- package/overlays/pulumi/README.md +472 -0
- package/overlays/pulumi/devcontainer.patch.json +13 -0
- package/overlays/pulumi/overlay.yml +14 -0
- package/overlays/pulumi/verify.sh +31 -0
- package/overlays/python/README.md +919 -0
- package/overlays/python/devcontainer.patch.json +41 -0
- package/overlays/python/overlay.yml +12 -0
- package/overlays/python/requirements-overlay.txt +13 -0
- package/overlays/python/setup.sh +47 -0
- package/overlays/python/verify.sh +32 -0
- package/overlays/rabbitmq/.env.example +7 -0
- package/overlays/rabbitmq/README.md +680 -0
- package/overlays/rabbitmq/devcontainer.patch.json +28 -0
- package/overlays/rabbitmq/docker-compose.yml +30 -0
- package/overlays/rabbitmq/overlay.yml +18 -0
- package/overlays/rabbitmq/verify.sh +41 -0
- package/overlays/redis/.env.example +4 -0
- package/overlays/redis/README.md +776 -0
- package/overlays/redis/devcontainer.patch.json +21 -0
- package/overlays/redis/docker-compose.yml +21 -0
- package/overlays/redis/overlay.yml +15 -0
- package/overlays/redis/verify.sh +41 -0
- package/overlays/redpanda/.env.example +10 -0
- package/overlays/redpanda/README.md +703 -0
- package/overlays/redpanda/devcontainer.patch.json +37 -0
- package/overlays/redpanda/docker-compose.yml +67 -0
- package/overlays/redpanda/overlay.yml +21 -0
- package/overlays/redpanda/verify.sh +48 -0
- package/overlays/rust/README.md +299 -0
- package/overlays/rust/devcontainer.patch.json +39 -0
- package/overlays/rust/overlay.yml +15 -0
- package/overlays/rust/setup.sh +36 -0
- package/overlays/rust/verify.sh +51 -0
- package/overlays/sqlite/README.md +584 -0
- package/overlays/sqlite/devcontainer.patch.json +14 -0
- package/overlays/sqlite/overlay.yml +15 -0
- package/overlays/sqlite/setup.sh +27 -0
- package/overlays/sqlite/verify.sh +43 -0
- package/overlays/sqlserver/.env.example +6 -0
- package/overlays/sqlserver/README.md +592 -0
- package/overlays/sqlserver/devcontainer.patch.json +22 -0
- package/overlays/sqlserver/docker-compose.yml +32 -0
- package/overlays/sqlserver/overlay.yml +17 -0
- package/overlays/sqlserver/verify.sh +30 -0
- package/overlays/tempo/.env.example +5 -0
- package/overlays/tempo/README.md +273 -0
- package/overlays/tempo/devcontainer.patch.json +12 -0
- package/overlays/tempo/docker-compose.yml +20 -0
- package/overlays/tempo/overlay.yml +20 -0
- package/overlays/tempo/tempo-config.yaml +32 -0
- package/overlays/tempo/verify.sh +31 -0
- package/overlays/terraform/README.md +389 -0
- package/overlays/terraform/devcontainer.patch.json +15 -0
- package/overlays/terraform/overlay.yml +14 -0
- package/overlays/terraform/verify.sh +63 -0
- package/package.json +74 -0
- package/templates/README.md +285 -0
- package/templates/compose/.devcontainer/devcontainer.json +46 -0
- package/templates/compose/.devcontainer/docker-compose.yml +12 -0
- package/templates/compose/README.md +20 -0
- package/templates/plain/.devcontainer/devcontainer.json +35 -0
- package/templates/plain/README.md +21 -0
- package/tool/README.md +281 -0
- package/tool/schema/base-images.schema.json +43 -0
- package/tool/schema/base-templates.schema.json +34 -0
- package/tool/schema/config.schema.json +71 -0
- package/tool/schema/overlay-manifest.schema.json +86 -0
|
@@ -0,0 +1,540 @@
|
|
|
1
|
+
# Custom Patches - Project-Specific Customizations
|
|
2
|
+
|
|
3
|
+
This guide explains how to use the `.devcontainer/custom/` directory to preserve project-specific customizations across regenerations.
|
|
4
|
+
|
|
5
|
+
## Overview
|
|
6
|
+
|
|
7
|
+
When you regenerate a devcontainer (e.g., to add a new overlay), all manual changes to the generated files are normally lost. The **custom patches** feature solves this problem by allowing you to define customizations in a special directory that is preserved and automatically merged during regeneration.
|
|
8
|
+
|
|
9
|
+
## Quick Start
|
|
10
|
+
|
|
11
|
+
### 1. Generate Initial Devcontainer
|
|
12
|
+
|
|
13
|
+
```bash
|
|
14
|
+
npm run init -- --stack compose --language nodejs --database postgres
|
|
15
|
+
```
|
|
16
|
+
|
|
17
|
+
### 2. Add Custom Patches
|
|
18
|
+
|
|
19
|
+
Create the custom directory and add your customizations:
|
|
20
|
+
|
|
21
|
+
```bash
|
|
22
|
+
mkdir -p .devcontainer/custom
|
|
23
|
+
```
|
|
24
|
+
|
|
25
|
+
Create a custom devcontainer patch:
|
|
26
|
+
|
|
27
|
+
```json
|
|
28
|
+
// .devcontainer/custom/devcontainer.patch.json
|
|
29
|
+
{
|
|
30
|
+
"mounts": ["source=${localWorkspaceFolder}/../shared-libs,target=/workspace/shared,type=bind"],
|
|
31
|
+
"customizations": {
|
|
32
|
+
"vscode": {
|
|
33
|
+
"extensions": ["eamodio.gitlens"]
|
|
34
|
+
}
|
|
35
|
+
}
|
|
36
|
+
}
|
|
37
|
+
```
|
|
38
|
+
|
|
39
|
+
### 3. Regenerate (Customizations Preserved)
|
|
40
|
+
|
|
41
|
+
```bash
|
|
42
|
+
# Add a new overlay by regenerating
|
|
43
|
+
npm run init -- --from-manifest .devcontainer/superposition.json
|
|
44
|
+
|
|
45
|
+
# Select additional overlays (e.g., aws-cli)
|
|
46
|
+
# Your custom patches will be automatically applied ✅
|
|
47
|
+
```
|
|
48
|
+
|
|
49
|
+
## Supported Customization Files
|
|
50
|
+
|
|
51
|
+
The `.devcontainer/custom/` directory supports the following files:
|
|
52
|
+
|
|
53
|
+
### 1. `devcontainer.patch.json`
|
|
54
|
+
|
|
55
|
+
Patches to merge into the generated `devcontainer.json`.
|
|
56
|
+
|
|
57
|
+
**Use cases:**
|
|
58
|
+
|
|
59
|
+
- Add custom mounts
|
|
60
|
+
- Add custom environment variables
|
|
61
|
+
- Add custom VS Code extensions
|
|
62
|
+
- Override settings
|
|
63
|
+
|
|
64
|
+
**Example:**
|
|
65
|
+
|
|
66
|
+
```json
|
|
67
|
+
{
|
|
68
|
+
"mounts": [
|
|
69
|
+
"source=${localWorkspaceFolder}/../shared,target=/workspace/shared,type=bind",
|
|
70
|
+
"source=${localWorkspaceFolder}/../cache,target=/workspace/cache,type=bind"
|
|
71
|
+
],
|
|
72
|
+
"remoteEnv": {
|
|
73
|
+
"MY_CUSTOM_VAR": "value",
|
|
74
|
+
"API_ENDPOINT": "https://api.example.com"
|
|
75
|
+
},
|
|
76
|
+
"customizations": {
|
|
77
|
+
"vscode": {
|
|
78
|
+
"extensions": ["eamodio.gitlens", "myorg.custom-extension"],
|
|
79
|
+
"settings": {
|
|
80
|
+
"editor.formatOnSave": true
|
|
81
|
+
}
|
|
82
|
+
}
|
|
83
|
+
}
|
|
84
|
+
}
|
|
85
|
+
```
|
|
86
|
+
|
|
87
|
+
### 2. `docker-compose.patch.yml`
|
|
88
|
+
|
|
89
|
+
Patches to merge into the generated `docker-compose.yml` (for compose-based stacks only).
|
|
90
|
+
|
|
91
|
+
**Use cases:**
|
|
92
|
+
|
|
93
|
+
- Add custom services
|
|
94
|
+
- Add custom volumes
|
|
95
|
+
- Modify existing services
|
|
96
|
+
|
|
97
|
+
**Example:**
|
|
98
|
+
|
|
99
|
+
```yaml
|
|
100
|
+
services:
|
|
101
|
+
redis:
|
|
102
|
+
image: redis:alpine
|
|
103
|
+
ports:
|
|
104
|
+
- '6379:6379'
|
|
105
|
+
networks:
|
|
106
|
+
- devnet
|
|
107
|
+
|
|
108
|
+
minio:
|
|
109
|
+
image: minio/minio:latest
|
|
110
|
+
command: server /data --console-address ":9001"
|
|
111
|
+
environment:
|
|
112
|
+
MINIO_ROOT_USER: minioadmin
|
|
113
|
+
MINIO_ROOT_PASSWORD: minioadmin
|
|
114
|
+
ports:
|
|
115
|
+
- '9000:9000'
|
|
116
|
+
- '9001:9001'
|
|
117
|
+
networks:
|
|
118
|
+
- devnet
|
|
119
|
+
```
|
|
120
|
+
|
|
121
|
+
### 3. `environment.env`
|
|
122
|
+
|
|
123
|
+
Custom environment variables to append to `.env.example`.
|
|
124
|
+
|
|
125
|
+
**Use cases:**
|
|
126
|
+
|
|
127
|
+
- Add API keys
|
|
128
|
+
- Add feature flags
|
|
129
|
+
- Add custom configuration
|
|
130
|
+
|
|
131
|
+
**Example:**
|
|
132
|
+
|
|
133
|
+
```bash
|
|
134
|
+
# Custom Environment Variables
|
|
135
|
+
MY_API_KEY=secret123
|
|
136
|
+
CUSTOM_FEATURE_FLAG=enabled
|
|
137
|
+
DATABASE_URL=postgresql://localhost:5432/mydb
|
|
138
|
+
```
|
|
139
|
+
|
|
140
|
+
### 4. `scripts/post-create.sh`
|
|
141
|
+
|
|
142
|
+
Custom script to run after container creation (one-time setup).
|
|
143
|
+
|
|
144
|
+
**Use cases:**
|
|
145
|
+
|
|
146
|
+
- Download proprietary tools
|
|
147
|
+
- Set up local databases
|
|
148
|
+
- Initialize project-specific dependencies
|
|
149
|
+
|
|
150
|
+
**Example:**
|
|
151
|
+
|
|
152
|
+
```bash
|
|
153
|
+
#!/bin/bash
|
|
154
|
+
# Custom post-create setup
|
|
155
|
+
|
|
156
|
+
echo "🎨 Running custom initialization..."
|
|
157
|
+
|
|
158
|
+
# Download proprietary CLI
|
|
159
|
+
curl -o /tmp/custom-cli.tar.gz https://example.com/custom-cli.tar.gz
|
|
160
|
+
tar -xzf /tmp/custom-cli.tar.gz -C /usr/local/bin/
|
|
161
|
+
|
|
162
|
+
# Initialize custom database schema
|
|
163
|
+
psql -h postgres -U postgres -d myapp -f .devcontainer/custom/files/schema.sql
|
|
164
|
+
|
|
165
|
+
echo "✅ Custom initialization complete"
|
|
166
|
+
```
|
|
167
|
+
|
|
168
|
+
### 5. `scripts/post-start.sh`
|
|
169
|
+
|
|
170
|
+
Custom script to run every time the container starts.
|
|
171
|
+
|
|
172
|
+
**Use cases:**
|
|
173
|
+
|
|
174
|
+
- Start background services
|
|
175
|
+
- Refresh credentials
|
|
176
|
+
- Check environment health
|
|
177
|
+
|
|
178
|
+
**Example:**
|
|
179
|
+
|
|
180
|
+
```bash
|
|
181
|
+
#!/bin/bash
|
|
182
|
+
# Custom post-start tasks
|
|
183
|
+
|
|
184
|
+
echo "✨ Running custom startup tasks..."
|
|
185
|
+
|
|
186
|
+
# Refresh AWS credentials
|
|
187
|
+
aws configure set region us-east-1
|
|
188
|
+
|
|
189
|
+
# Check database connectivity
|
|
190
|
+
pg_isready -h postgres -U postgres || echo "⚠️ Database not ready"
|
|
191
|
+
|
|
192
|
+
echo "✅ Startup tasks complete"
|
|
193
|
+
```
|
|
194
|
+
|
|
195
|
+
### 6. `files/`
|
|
196
|
+
|
|
197
|
+
Directory for additional files to copy into the devcontainer.
|
|
198
|
+
|
|
199
|
+
**Use cases:**
|
|
200
|
+
|
|
201
|
+
- Custom configuration files
|
|
202
|
+
- Project-specific scripts
|
|
203
|
+
- Seed data
|
|
204
|
+
|
|
205
|
+
**Example structure:**
|
|
206
|
+
|
|
207
|
+
```
|
|
208
|
+
.devcontainer/custom/files/
|
|
209
|
+
├── config.yml # Copied to .devcontainer/config.yml
|
|
210
|
+
├── scripts/
|
|
211
|
+
│ └── helper.sh # Copied to .devcontainer/scripts/helper.sh
|
|
212
|
+
└── data/
|
|
213
|
+
└── seed.sql # Copied to .devcontainer/data/seed.sql
|
|
214
|
+
```
|
|
215
|
+
|
|
216
|
+
## How It Works
|
|
217
|
+
|
|
218
|
+
### Merge Strategy
|
|
219
|
+
|
|
220
|
+
Custom patches are applied **after** all overlay merging, using the following strategy:
|
|
221
|
+
|
|
222
|
+
1. **Objects**: Deep merge (nested properties are merged recursively)
|
|
223
|
+
2. **Arrays**: Concatenate and deduplicate
|
|
224
|
+
3. **Primitives**: Custom value takes precedence
|
|
225
|
+
4. **Scripts**: Chained with `&&` in lifecycle commands
|
|
226
|
+
|
|
227
|
+
### Application Order
|
|
228
|
+
|
|
229
|
+
1. Base template loaded
|
|
230
|
+
2. Overlays applied in order
|
|
231
|
+
3. Port offsets applied
|
|
232
|
+
4. **Custom patches applied** ← Your customizations
|
|
233
|
+
5. Files written to disk
|
|
234
|
+
|
|
235
|
+
### Preservation During Regeneration
|
|
236
|
+
|
|
237
|
+
The `.devcontainer/custom/` directory is:
|
|
238
|
+
|
|
239
|
+
- ✅ **Preserved** during regeneration (never deleted)
|
|
240
|
+
- ✅ **Automatically merged** into generated files
|
|
241
|
+
- ✅ **Tracked** in `superposition.json` manifest
|
|
242
|
+
|
|
243
|
+
## Use Cases
|
|
244
|
+
|
|
245
|
+
### Use Case 1: Shared Workspace Mounts
|
|
246
|
+
|
|
247
|
+
**Problem**: Your project depends on shared libraries in a sibling directory.
|
|
248
|
+
|
|
249
|
+
**Solution**:
|
|
250
|
+
|
|
251
|
+
```json
|
|
252
|
+
// .devcontainer/custom/devcontainer.patch.json
|
|
253
|
+
{
|
|
254
|
+
"mounts": [
|
|
255
|
+
"source=${localWorkspaceFolder}/../shared-libs,target=/workspace/libs,type=bind,readonly"
|
|
256
|
+
]
|
|
257
|
+
}
|
|
258
|
+
```
|
|
259
|
+
|
|
260
|
+
### Use Case 2: Custom Post-Start Script
|
|
261
|
+
|
|
262
|
+
**Problem**: You need to initialize proprietary tools on every container start.
|
|
263
|
+
|
|
264
|
+
**Solution**:
|
|
265
|
+
|
|
266
|
+
```bash
|
|
267
|
+
# .devcontainer/custom/scripts/post-start.sh
|
|
268
|
+
#!/bin/bash
|
|
269
|
+
echo "Initializing proprietary tools..."
|
|
270
|
+
/usr/local/bin/custom-tool init
|
|
271
|
+
```
|
|
272
|
+
|
|
273
|
+
### Use Case 3: Additional Docker Compose Service
|
|
274
|
+
|
|
275
|
+
**Problem**: You need MinIO for local S3 testing, but it's not a standard overlay.
|
|
276
|
+
|
|
277
|
+
**Solution**:
|
|
278
|
+
|
|
279
|
+
```yaml
|
|
280
|
+
# .devcontainer/custom/docker-compose.patch.yml
|
|
281
|
+
services:
|
|
282
|
+
minio:
|
|
283
|
+
image: minio/minio:latest
|
|
284
|
+
command: server /data --console-address ":9001"
|
|
285
|
+
ports:
|
|
286
|
+
- '9000:9000'
|
|
287
|
+
- '9001:9001'
|
|
288
|
+
networks:
|
|
289
|
+
- devnet
|
|
290
|
+
```
|
|
291
|
+
|
|
292
|
+
### Use Case 4: Team Config vs Personal Config
|
|
293
|
+
|
|
294
|
+
**Scenario**: Team uses standardized overlays, but you have personal preferences.
|
|
295
|
+
|
|
296
|
+
**Solution**:
|
|
297
|
+
|
|
298
|
+
```json
|
|
299
|
+
// .devcontainer/custom/devcontainer.patch.json (in .gitignore)
|
|
300
|
+
{
|
|
301
|
+
"customizations": {
|
|
302
|
+
"vscode": {
|
|
303
|
+
"extensions": ["eamodio.gitlens", "myorg.personal-extension"],
|
|
304
|
+
"settings": {
|
|
305
|
+
"editor.fontSize": 14
|
|
306
|
+
}
|
|
307
|
+
}
|
|
308
|
+
}
|
|
309
|
+
}
|
|
310
|
+
```
|
|
311
|
+
|
|
312
|
+
**Tip**: Add `.devcontainer/custom/` to `.gitignore` for personal config, or commit it for team config.
|
|
313
|
+
|
|
314
|
+
## Workflow Examples
|
|
315
|
+
|
|
316
|
+
### Initial Generation
|
|
317
|
+
|
|
318
|
+
```bash
|
|
319
|
+
# 1. Generate devcontainer
|
|
320
|
+
npm run init -- --stack compose --language nodejs --database postgres
|
|
321
|
+
|
|
322
|
+
# 2. Test the generated devcontainer
|
|
323
|
+
# Open in VS Code: Dev Containers: Reopen in Container
|
|
324
|
+
|
|
325
|
+
# 3. Add customizations
|
|
326
|
+
mkdir -p .devcontainer/custom
|
|
327
|
+
cat > .devcontainer/custom/devcontainer.patch.json << EOF
|
|
328
|
+
{
|
|
329
|
+
"mounts": ["source=\${localWorkspaceFolder}/../shared,target=/workspace/shared,type=bind"]
|
|
330
|
+
}
|
|
331
|
+
EOF
|
|
332
|
+
|
|
333
|
+
# 4. Regenerate to apply customizations
|
|
334
|
+
npm run init -- --from-manifest .devcontainer/superposition.json
|
|
335
|
+
# (Select same overlays or add new ones)
|
|
336
|
+
|
|
337
|
+
# 5. Customizations are now applied ✅
|
|
338
|
+
```
|
|
339
|
+
|
|
340
|
+
### Regeneration Workflow
|
|
341
|
+
|
|
342
|
+
```bash
|
|
343
|
+
# You want to add Redis to an existing setup
|
|
344
|
+
|
|
345
|
+
# 1. Check current configuration
|
|
346
|
+
cat .devcontainer/superposition.json
|
|
347
|
+
|
|
348
|
+
# 2. Regenerate from manifest
|
|
349
|
+
npm run init -- --from-manifest .devcontainer/superposition.json
|
|
350
|
+
|
|
351
|
+
# 3. In the questionnaire, select:
|
|
352
|
+
# - Keep existing: nodejs, postgres
|
|
353
|
+
# - Add new: redis
|
|
354
|
+
#
|
|
355
|
+
# 4. Custom patches are automatically preserved and merged ✅
|
|
356
|
+
```
|
|
357
|
+
|
|
358
|
+
### Migrating Manual Changes
|
|
359
|
+
|
|
360
|
+
If you've already made manual changes to generated files:
|
|
361
|
+
|
|
362
|
+
```bash
|
|
363
|
+
# 1. Extract your manual changes into custom patches
|
|
364
|
+
|
|
365
|
+
# Example: You manually added a mount to devcontainer.json
|
|
366
|
+
# Extract it:
|
|
367
|
+
cat .devcontainer/devcontainer.json | jq '.mounts' > /tmp/mounts.json
|
|
368
|
+
|
|
369
|
+
# Create custom patch:
|
|
370
|
+
mkdir -p .devcontainer/custom
|
|
371
|
+
cat > .devcontainer/custom/devcontainer.patch.json << EOF
|
|
372
|
+
{
|
|
373
|
+
"mounts": $(cat /tmp/mounts.json)
|
|
374
|
+
}
|
|
375
|
+
EOF
|
|
376
|
+
|
|
377
|
+
# 2. Regenerate (your changes will now be preserved)
|
|
378
|
+
npm run init -- --from-manifest .devcontainer/superposition.json
|
|
379
|
+
|
|
380
|
+
# 3. Verify custom patches were applied
|
|
381
|
+
cat .devcontainer/devcontainer.json | jq '.mounts'
|
|
382
|
+
```
|
|
383
|
+
|
|
384
|
+
## Advanced Topics
|
|
385
|
+
|
|
386
|
+
### Custom Files Copying
|
|
387
|
+
|
|
388
|
+
Files in `.devcontainer/custom/files/` are automatically copied during generation:
|
|
389
|
+
|
|
390
|
+
```
|
|
391
|
+
.devcontainer/custom/files/schema.sql
|
|
392
|
+
→ Copied to .devcontainer/schema.sql
|
|
393
|
+
|
|
394
|
+
.devcontainer/custom/files/configs/app.yml
|
|
395
|
+
→ Copied to .devcontainer/configs/app.yml
|
|
396
|
+
```
|
|
397
|
+
|
|
398
|
+
**Use case**: Seed data, configuration templates, helper scripts.
|
|
399
|
+
|
|
400
|
+
### Script Execution Order
|
|
401
|
+
|
|
402
|
+
Lifecycle scripts are executed in this order:
|
|
403
|
+
|
|
404
|
+
**postCreateCommand** (one-time):
|
|
405
|
+
|
|
406
|
+
1. Overlay setup scripts (e.g., `setup-nodejs.sh`)
|
|
407
|
+
2. Custom post-create script (`custom/scripts/post-create.sh`)
|
|
408
|
+
|
|
409
|
+
**postStartCommand** (every start):
|
|
410
|
+
|
|
411
|
+
1. Overlay verify scripts (e.g., `verify-nodejs.sh`)
|
|
412
|
+
2. Custom post-start script (`custom/scripts/post-start.sh`)
|
|
413
|
+
|
|
414
|
+
### Manifest Tracking
|
|
415
|
+
|
|
416
|
+
The `superposition.json` manifest tracks whether customizations are present:
|
|
417
|
+
|
|
418
|
+
```json
|
|
419
|
+
{
|
|
420
|
+
"version": "0.1.0",
|
|
421
|
+
"baseTemplate": "compose",
|
|
422
|
+
"overlays": ["nodejs", "postgres"],
|
|
423
|
+
"customizations": {
|
|
424
|
+
"enabled": true,
|
|
425
|
+
"location": ".devcontainer/custom"
|
|
426
|
+
}
|
|
427
|
+
}
|
|
428
|
+
```
|
|
429
|
+
|
|
430
|
+
This helps tools understand that custom patches are in use.
|
|
431
|
+
|
|
432
|
+
## Best Practices
|
|
433
|
+
|
|
434
|
+
### ✅ Do
|
|
435
|
+
|
|
436
|
+
- **Use custom patches for project-specific needs** that don't belong in standard overlays
|
|
437
|
+
- **Keep custom patches minimal** - only override what's necessary
|
|
438
|
+
- **Document your customizations** in comments within patch files
|
|
439
|
+
- **Test regeneration** to ensure custom patches apply correctly
|
|
440
|
+
- **Commit custom patches** for team configurations, `.gitignore` for personal configs
|
|
441
|
+
|
|
442
|
+
### ❌ Don't
|
|
443
|
+
|
|
444
|
+
- **Don't override critical overlay settings** unless absolutely necessary
|
|
445
|
+
- **Don't use custom patches for things that should be overlays** - contribute overlays instead
|
|
446
|
+
- **Don't ignore errors** from custom patch application - they indicate conflicts
|
|
447
|
+
- **Don't hardcode secrets** in custom patches - use `.env` files
|
|
448
|
+
|
|
449
|
+
## Troubleshooting
|
|
450
|
+
|
|
451
|
+
### Custom Patches Not Applied
|
|
452
|
+
|
|
453
|
+
**Symptom**: Regeneration doesn't include custom changes.
|
|
454
|
+
|
|
455
|
+
**Solution**:
|
|
456
|
+
|
|
457
|
+
1. Verify custom directory exists: `ls .devcontainer/custom/`
|
|
458
|
+
2. Check patch file syntax: `jq . .devcontainer/custom/devcontainer.patch.json`
|
|
459
|
+
3. Look for error messages during generation
|
|
460
|
+
4. Verify manifest tracking: `cat .devcontainer/superposition.json | jq .customizations`
|
|
461
|
+
|
|
462
|
+
### Merge Conflicts
|
|
463
|
+
|
|
464
|
+
**Symptom**: Custom patch conflicts with overlay settings.
|
|
465
|
+
|
|
466
|
+
**Solution**:
|
|
467
|
+
|
|
468
|
+
- Custom patches are applied **last**, so they take precedence
|
|
469
|
+
- If conflicts occur, check console output for warnings
|
|
470
|
+
- Use deep merge strategy - objects merge, primitives override
|
|
471
|
+
|
|
472
|
+
### Scripts Not Executing
|
|
473
|
+
|
|
474
|
+
**Symptom**: Custom scripts don't run.
|
|
475
|
+
|
|
476
|
+
**Solution**:
|
|
477
|
+
|
|
478
|
+
1. Ensure scripts are executable: `chmod +x .devcontainer/custom/scripts/*.sh`
|
|
479
|
+
2. Verify scripts are referenced in devcontainer.json:
|
|
480
|
+
```bash
|
|
481
|
+
cat .devcontainer/devcontainer.json | jq '.postCreateCommand'
|
|
482
|
+
```
|
|
483
|
+
3. Check script paths are correct (relative to workspace root)
|
|
484
|
+
|
|
485
|
+
## Examples
|
|
486
|
+
|
|
487
|
+
### Example 1: Monorepo with Shared Dependencies
|
|
488
|
+
|
|
489
|
+
```json
|
|
490
|
+
// .devcontainer/custom/devcontainer.patch.json
|
|
491
|
+
{
|
|
492
|
+
"mounts": [
|
|
493
|
+
"source=${localWorkspaceFolder}/../packages/shared,target=/workspace/shared,type=bind,readonly",
|
|
494
|
+
"source=${localWorkspaceFolder}/../packages/utils,target=/workspace/utils,type=bind,readonly"
|
|
495
|
+
],
|
|
496
|
+
"remoteEnv": {
|
|
497
|
+
"MONOREPO_ROOT": "/workspace"
|
|
498
|
+
}
|
|
499
|
+
}
|
|
500
|
+
```
|
|
501
|
+
|
|
502
|
+
### Example 2: Custom Development Tools
|
|
503
|
+
|
|
504
|
+
```bash
|
|
505
|
+
# .devcontainer/custom/scripts/post-create.sh
|
|
506
|
+
#!/bin/bash
|
|
507
|
+
|
|
508
|
+
# Install custom linter
|
|
509
|
+
npm install -g @myorg/custom-linter
|
|
510
|
+
|
|
511
|
+
# Set up git hooks
|
|
512
|
+
cd /workspace
|
|
513
|
+
git config core.hooksPath .devcontainer/custom/files/git-hooks
|
|
514
|
+
|
|
515
|
+
# Initialize database with custom schema
|
|
516
|
+
psql -h postgres -U postgres -d myapp -f .devcontainer/custom/files/schema.sql
|
|
517
|
+
```
|
|
518
|
+
|
|
519
|
+
### Example 3: Development Environment Variables
|
|
520
|
+
|
|
521
|
+
```bash
|
|
522
|
+
# .devcontainer/custom/environment.env
|
|
523
|
+
|
|
524
|
+
# Feature flags for development
|
|
525
|
+
FEATURE_NEW_UI=enabled
|
|
526
|
+
FEATURE_EXPERIMENTAL_API=enabled
|
|
527
|
+
|
|
528
|
+
# API endpoints
|
|
529
|
+
API_BASE_URL=http://localhost:3000
|
|
530
|
+
AUTH_SERVICE_URL=http://localhost:4000
|
|
531
|
+
|
|
532
|
+
# Debug settings
|
|
533
|
+
DEBUG=app:*
|
|
534
|
+
LOG_LEVEL=debug
|
|
535
|
+
```
|
|
536
|
+
|
|
537
|
+
## See Also
|
|
538
|
+
|
|
539
|
+
- [Overlay Authoring Guide](../.github/instructions/overlay-authoring.instructions.md)
|
|
540
|
+
- [DevContainer Specification](https://containers.dev/)
|