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,279 @@
|
|
|
1
|
+
# Service Dependencies and Startup Order
|
|
2
|
+
|
|
3
|
+
## Overview
|
|
4
|
+
|
|
5
|
+
The overlay system supports service dependencies through `depends_on` in docker-compose files and `runServices` arrays in devcontainer.json. The composer must intelligently handle these when merging overlays.
|
|
6
|
+
|
|
7
|
+
## Dependency Graph
|
|
8
|
+
|
|
9
|
+
```
|
|
10
|
+
postgres, redis (base infrastructure)
|
|
11
|
+
↓
|
|
12
|
+
jaeger, prometheus, loki (observability backends)
|
|
13
|
+
↓
|
|
14
|
+
otel-collector (telemetry pipeline)
|
|
15
|
+
↓
|
|
16
|
+
grafana (visualization)
|
|
17
|
+
↓
|
|
18
|
+
devcontainer (main application)
|
|
19
|
+
```
|
|
20
|
+
|
|
21
|
+
## Service Order Hints
|
|
22
|
+
|
|
23
|
+
Overlays use `_serviceOrder` (custom field, non-standard) to indicate startup priority:
|
|
24
|
+
|
|
25
|
+
- **Order 0** (implicit): postgres, redis - base infrastructure
|
|
26
|
+
- **Order 1**: jaeger, prometheus, loki - observability backends
|
|
27
|
+
- **Order 2**: otel-collector - telemetry collection
|
|
28
|
+
- **Order 3**: grafana - visualization layer
|
|
29
|
+
|
|
30
|
+
The devcontainer service should start last, after all selected infrastructure.
|
|
31
|
+
|
|
32
|
+
## Docker Compose depends_on
|
|
33
|
+
|
|
34
|
+
### Static Dependencies (in overlay files)
|
|
35
|
+
|
|
36
|
+
Each overlay's docker-compose.yml includes ALL potential dependencies:
|
|
37
|
+
|
|
38
|
+
**otel-collector/docker-compose.yml:**
|
|
39
|
+
|
|
40
|
+
```yaml
|
|
41
|
+
services:
|
|
42
|
+
otel-collector:
|
|
43
|
+
depends_on:
|
|
44
|
+
- jaeger
|
|
45
|
+
- prometheus
|
|
46
|
+
- loki
|
|
47
|
+
```
|
|
48
|
+
|
|
49
|
+
**grafana/docker-compose.yml:**
|
|
50
|
+
|
|
51
|
+
```yaml
|
|
52
|
+
services:
|
|
53
|
+
grafana:
|
|
54
|
+
depends_on:
|
|
55
|
+
- prometheus
|
|
56
|
+
- loki
|
|
57
|
+
- jaeger
|
|
58
|
+
```
|
|
59
|
+
|
|
60
|
+
**compose/docker-compose.yml:**
|
|
61
|
+
|
|
62
|
+
```yaml
|
|
63
|
+
services:
|
|
64
|
+
devcontainer:
|
|
65
|
+
depends_on:
|
|
66
|
+
- postgres
|
|
67
|
+
- redis
|
|
68
|
+
- otel-collector
|
|
69
|
+
```
|
|
70
|
+
|
|
71
|
+
### Composer Responsibility
|
|
72
|
+
|
|
73
|
+
The composer MUST:
|
|
74
|
+
|
|
75
|
+
1. **Filter depends_on** - Remove dependencies for services not selected
|
|
76
|
+
|
|
77
|
+
```javascript
|
|
78
|
+
// If jaeger is not selected, remove it from otel-collector's depends_on
|
|
79
|
+
if (!selectedOverlays.includes('jaeger')) {
|
|
80
|
+
delete services['otel-collector'].depends_on['jaeger'];
|
|
81
|
+
}
|
|
82
|
+
```
|
|
83
|
+
|
|
84
|
+
2. **Clean empty depends_on** - Remove the field if no dependencies remain
|
|
85
|
+
|
|
86
|
+
```javascript
|
|
87
|
+
if (Object.keys(service.depends_on).length === 0) {
|
|
88
|
+
delete service.depends_on;
|
|
89
|
+
}
|
|
90
|
+
```
|
|
91
|
+
|
|
92
|
+
3. **Validate dependency chain** - Ensure no circular dependencies
|
|
93
|
+
4. **Order docker-compose files** - Merge in dependency order to avoid forward references
|
|
94
|
+
|
|
95
|
+
## runServices Array
|
|
96
|
+
|
|
97
|
+
The `runServices` array in devcontainer.json controls which services start automatically.
|
|
98
|
+
|
|
99
|
+
### Overlay Definitions
|
|
100
|
+
|
|
101
|
+
Each overlay declares its service(s):
|
|
102
|
+
|
|
103
|
+
```json
|
|
104
|
+
// postgres/devcontainer.patch.json
|
|
105
|
+
{
|
|
106
|
+
"runServices": ["postgres"]
|
|
107
|
+
}
|
|
108
|
+
|
|
109
|
+
// otel-collector/devcontainer.patch.json
|
|
110
|
+
{
|
|
111
|
+
"runServices": ["otel-collector"],
|
|
112
|
+
"_serviceOrder": 2
|
|
113
|
+
}
|
|
114
|
+
```
|
|
115
|
+
|
|
116
|
+
### Composer Merge Strategy
|
|
117
|
+
|
|
118
|
+
When merging `runServices`:
|
|
119
|
+
|
|
120
|
+
1. **Collect all services** from base template + selected overlays
|
|
121
|
+
2. **Sort by \_serviceOrder** (ascending)
|
|
122
|
+
3. **Merge into single array** maintaining order
|
|
123
|
+
4. **Remove duplicates** while preserving order
|
|
124
|
+
|
|
125
|
+
**Example merge:**
|
|
126
|
+
|
|
127
|
+
```javascript
|
|
128
|
+
// Selected overlays: postgres, redis, jaeger, prometheus, otel-collector, grafana
|
|
129
|
+
const runServices = [
|
|
130
|
+
// Order 0 (infrastructure)
|
|
131
|
+
'postgres',
|
|
132
|
+
'redis',
|
|
133
|
+
// Order 1 (observability backends)
|
|
134
|
+
'jaeger',
|
|
135
|
+
'prometheus',
|
|
136
|
+
// Order 2 (telemetry pipeline)
|
|
137
|
+
'otel-collector',
|
|
138
|
+
// Order 3 (visualization)
|
|
139
|
+
'grafana',
|
|
140
|
+
];
|
|
141
|
+
```
|
|
142
|
+
|
|
143
|
+
The devcontainer service itself is NOT in runServices (it's the main service).
|
|
144
|
+
|
|
145
|
+
## Implementation Example
|
|
146
|
+
|
|
147
|
+
```typescript
|
|
148
|
+
interface Overlay {
|
|
149
|
+
name: string;
|
|
150
|
+
devcontainer: {
|
|
151
|
+
runServices?: string[];
|
|
152
|
+
_serviceOrder?: number;
|
|
153
|
+
};
|
|
154
|
+
dockerCompose?: {
|
|
155
|
+
services: Record<
|
|
156
|
+
string,
|
|
157
|
+
{
|
|
158
|
+
depends_on?: string[];
|
|
159
|
+
// ... other fields
|
|
160
|
+
}
|
|
161
|
+
>;
|
|
162
|
+
};
|
|
163
|
+
}
|
|
164
|
+
|
|
165
|
+
function mergeOverlays(baseTemplate: any, overlays: Overlay[]) {
|
|
166
|
+
const selectedServices = new Set(overlays.map((o) => o.name));
|
|
167
|
+
const result = { ...baseTemplate };
|
|
168
|
+
|
|
169
|
+
// 1. Merge runServices with ordering
|
|
170
|
+
const servicesByOrder = overlays
|
|
171
|
+
.flatMap((o) =>
|
|
172
|
+
(o.devcontainer.runServices || []).map((s) => ({
|
|
173
|
+
name: s,
|
|
174
|
+
order: o.devcontainer._serviceOrder || 0,
|
|
175
|
+
}))
|
|
176
|
+
)
|
|
177
|
+
.sort((a, b) => a.order - b.order);
|
|
178
|
+
|
|
179
|
+
result.runServices = [...new Set(servicesByOrder.map((s) => s.name))];
|
|
180
|
+
|
|
181
|
+
// 2. Merge docker-compose and filter depends_on
|
|
182
|
+
for (const overlay of overlays) {
|
|
183
|
+
if (!overlay.dockerCompose) continue;
|
|
184
|
+
|
|
185
|
+
for (const [serviceName, service] of Object.entries(overlay.dockerCompose.services)) {
|
|
186
|
+
if (service.depends_on) {
|
|
187
|
+
// Filter out unselected dependencies
|
|
188
|
+
service.depends_on = service.depends_on.filter((dep) => selectedServices.has(dep));
|
|
189
|
+
|
|
190
|
+
// Remove empty depends_on
|
|
191
|
+
if (service.depends_on.length === 0) {
|
|
192
|
+
delete service.depends_on;
|
|
193
|
+
}
|
|
194
|
+
}
|
|
195
|
+
|
|
196
|
+
// Merge service definition
|
|
197
|
+
result.services[serviceName] = {
|
|
198
|
+
...result.services[serviceName],
|
|
199
|
+
...service,
|
|
200
|
+
};
|
|
201
|
+
}
|
|
202
|
+
}
|
|
203
|
+
|
|
204
|
+
return result;
|
|
205
|
+
}
|
|
206
|
+
```
|
|
207
|
+
|
|
208
|
+
## Edge Cases
|
|
209
|
+
|
|
210
|
+
### Partial Observability Stack
|
|
211
|
+
|
|
212
|
+
If user selects only some observability tools:
|
|
213
|
+
|
|
214
|
+
**Selection:** otel-collector + prometheus (no jaeger, no loki)
|
|
215
|
+
|
|
216
|
+
**Result:**
|
|
217
|
+
|
|
218
|
+
```yaml
|
|
219
|
+
# otel-collector depends only on prometheus
|
|
220
|
+
services:
|
|
221
|
+
otel-collector:
|
|
222
|
+
depends_on:
|
|
223
|
+
- prometheus # jaeger and loki removed
|
|
224
|
+
```
|
|
225
|
+
|
|
226
|
+
### No Dependencies
|
|
227
|
+
|
|
228
|
+
If a service has no selected dependencies:
|
|
229
|
+
|
|
230
|
+
**Selection:** jaeger only (standalone)
|
|
231
|
+
|
|
232
|
+
**Result:**
|
|
233
|
+
|
|
234
|
+
```yaml
|
|
235
|
+
# jaeger has no depends_on (removed entirely)
|
|
236
|
+
services:
|
|
237
|
+
jaeger:
|
|
238
|
+
image: jaegertracing/all-in-one:latest
|
|
239
|
+
# no depends_on field
|
|
240
|
+
```
|
|
241
|
+
|
|
242
|
+
### Devcontainer Dependencies
|
|
243
|
+
|
|
244
|
+
The main devcontainer service depends on all infrastructure:
|
|
245
|
+
|
|
246
|
+
**Selection:** postgres + otel-collector
|
|
247
|
+
|
|
248
|
+
**Result:**
|
|
249
|
+
|
|
250
|
+
```yaml
|
|
251
|
+
services:
|
|
252
|
+
devcontainer:
|
|
253
|
+
depends_on:
|
|
254
|
+
- postgres
|
|
255
|
+
- otel-collector
|
|
256
|
+
# redis removed (not selected)
|
|
257
|
+
```
|
|
258
|
+
|
|
259
|
+
## Validation
|
|
260
|
+
|
|
261
|
+
The composer should validate:
|
|
262
|
+
|
|
263
|
+
1. ✅ No circular dependencies
|
|
264
|
+
2. ✅ All dependencies in depends_on exist as services
|
|
265
|
+
3. ✅ runServices order matches dependency graph
|
|
266
|
+
4. ✅ No orphaned services (defined but not in runServices or depended upon)
|
|
267
|
+
|
|
268
|
+
## Testing Scenarios
|
|
269
|
+
|
|
270
|
+
Test these combinations:
|
|
271
|
+
|
|
272
|
+
1. **Full stack**: postgres + redis + jaeger + prometheus + loki + otel-collector + grafana
|
|
273
|
+
2. **Minimal**: postgres only
|
|
274
|
+
3. **Partial observability**: prometheus + grafana (no otel-collector)
|
|
275
|
+
4. **Trace-only**: jaeger + otel-collector (no metrics)
|
|
276
|
+
5. **Metrics-only**: prometheus + otel-collector (no tracing)
|
|
277
|
+
6. **Direct to backends**: jaeger + prometheus + loki (no otel-collector)
|
|
278
|
+
|
|
279
|
+
Each should produce valid docker-compose with correct dependencies.
|
|
@@ -0,0 +1,85 @@
|
|
|
1
|
+
# Custom Patches Example
|
|
2
|
+
|
|
3
|
+
This example demonstrates how to use custom patches to preserve project-specific customizations across regenerations.
|
|
4
|
+
|
|
5
|
+
## Scenario
|
|
6
|
+
|
|
7
|
+
You're working on a Node.js API that:
|
|
8
|
+
|
|
9
|
+
1. Uses shared libraries from a sibling directory
|
|
10
|
+
2. Needs MinIO for local S3 testing
|
|
11
|
+
3. Has custom environment variables for feature flags
|
|
12
|
+
4. Requires a custom initialization script
|
|
13
|
+
|
|
14
|
+
## Initial Setup
|
|
15
|
+
|
|
16
|
+
Generate the base devcontainer:
|
|
17
|
+
|
|
18
|
+
```bash
|
|
19
|
+
npm run init -- --stack compose --language nodejs --database postgres
|
|
20
|
+
```
|
|
21
|
+
|
|
22
|
+
## Add Custom Patches
|
|
23
|
+
|
|
24
|
+
### 1. Create Custom Directory
|
|
25
|
+
|
|
26
|
+
```bash
|
|
27
|
+
mkdir -p .devcontainer/custom/scripts
|
|
28
|
+
```
|
|
29
|
+
|
|
30
|
+
### 2. Add Custom Devcontainer Patch
|
|
31
|
+
|
|
32
|
+
File: `.devcontainer/custom/devcontainer.patch.json`
|
|
33
|
+
|
|
34
|
+
```json
|
|
35
|
+
{
|
|
36
|
+
"mounts": [
|
|
37
|
+
"source=${localWorkspaceFolder}/../shared-utils,target=/workspace/shared-utils,type=bind,readonly"
|
|
38
|
+
],
|
|
39
|
+
"customizations": {
|
|
40
|
+
"vscode": {
|
|
41
|
+
"extensions": ["eamodio.gitlens"]
|
|
42
|
+
}
|
|
43
|
+
}
|
|
44
|
+
}
|
|
45
|
+
```
|
|
46
|
+
|
|
47
|
+
### 3. Add Custom Docker Compose Service
|
|
48
|
+
|
|
49
|
+
File: `.devcontainer/custom/docker-compose.patch.yml`
|
|
50
|
+
|
|
51
|
+
```yaml
|
|
52
|
+
services:
|
|
53
|
+
minio:
|
|
54
|
+
image: minio/minio:latest
|
|
55
|
+
command: server /data --console-address ":9001"
|
|
56
|
+
ports:
|
|
57
|
+
- '9000:9000'
|
|
58
|
+
networks:
|
|
59
|
+
- devnet
|
|
60
|
+
```
|
|
61
|
+
|
|
62
|
+
### 4. Add Custom Environment Variables
|
|
63
|
+
|
|
64
|
+
File: `.devcontainer/custom/environment.env`
|
|
65
|
+
|
|
66
|
+
```bash
|
|
67
|
+
# Feature Flags
|
|
68
|
+
FEATURE_S3_STORAGE=enabled
|
|
69
|
+
S3_ENDPOINT=http://minio:9000
|
|
70
|
+
```
|
|
71
|
+
|
|
72
|
+
## Regenerate with Customizations
|
|
73
|
+
|
|
74
|
+
Add Redis to your stack:
|
|
75
|
+
|
|
76
|
+
```bash
|
|
77
|
+
npm run init -- --from-manifest .devcontainer/superposition.json
|
|
78
|
+
# Select redis in addition to existing overlays
|
|
79
|
+
```
|
|
80
|
+
|
|
81
|
+
## Result
|
|
82
|
+
|
|
83
|
+
After regeneration, all custom patches are preserved and merged! ✅
|
|
84
|
+
|
|
85
|
+
See [docs/custom-patches.md](../custom-patches.md) for complete documentation.
|