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,592 @@
|
|
|
1
|
+
# SQL Server Overlay
|
|
2
|
+
|
|
3
|
+
Microsoft SQL Server 2022 for Linux - enterprise-grade relational database for .NET and Microsoft stack development.
|
|
4
|
+
|
|
5
|
+
## Features
|
|
6
|
+
|
|
7
|
+
- **SQL Server 2022** - Latest version with modern T-SQL features
|
|
8
|
+
- **Developer Edition** - Full-featured free edition for development/testing
|
|
9
|
+
- **Docker Compose service** - Runs as separate container
|
|
10
|
+
- **Persistent storage** - Data survives container restarts
|
|
11
|
+
- **Health checks** - Ensures service is ready before use
|
|
12
|
+
- **VS Code Extension:** SQL Server (mssql) by Microsoft (ms-mssql.mssql)
|
|
13
|
+
|
|
14
|
+
## How It Works
|
|
15
|
+
|
|
16
|
+
This overlay adds Microsoft SQL Server 2022 for Linux as a Docker Compose service. The database runs in its own container and is accessible from your development container via the hostname `sqlserver`.
|
|
17
|
+
|
|
18
|
+
**Architecture:**
|
|
19
|
+
|
|
20
|
+
```mermaid
|
|
21
|
+
graph TD
|
|
22
|
+
A[Development Container<br/>Your application code<br/>VS Code mssql extension<br/>Connects to sqlserver:1433] -->|Docker network devnet| B[SQL Server Container<br/>SQL Server 2022<br/>Port 1433<br/>Data volume]
|
|
23
|
+
```
|
|
24
|
+
|
|
25
|
+
## Configuration
|
|
26
|
+
|
|
27
|
+
### Environment Variables
|
|
28
|
+
|
|
29
|
+
The overlay includes a `.env.example` file. Copy it to `.env` and customize:
|
|
30
|
+
|
|
31
|
+
```bash
|
|
32
|
+
cd .devcontainer
|
|
33
|
+
cp .env.example .env
|
|
34
|
+
```
|
|
35
|
+
|
|
36
|
+
**Default values (.env.example):**
|
|
37
|
+
|
|
38
|
+
```bash
|
|
39
|
+
# SQL Server Configuration
|
|
40
|
+
MSSQL_VERSION=2022-latest
|
|
41
|
+
MSSQL_SA_PASSWORD=YourStrong@Passw0rd
|
|
42
|
+
MSSQL_PID=Developer
|
|
43
|
+
MSSQL_PORT=1433
|
|
44
|
+
```
|
|
45
|
+
|
|
46
|
+
⚠️ **Password Requirements:** SQL Server requires passwords with:
|
|
47
|
+
|
|
48
|
+
- At least 8 characters
|
|
49
|
+
- At least one uppercase letter
|
|
50
|
+
- At least one lowercase letter
|
|
51
|
+
- At least one digit
|
|
52
|
+
- At least one special character
|
|
53
|
+
|
|
54
|
+
⚠️ **SECURITY:** Change the SA password for production use. The `.env` file is git-ignored.
|
|
55
|
+
|
|
56
|
+
### Port Configuration
|
|
57
|
+
|
|
58
|
+
The default port (1433) can be changed via the `--port-offset` option when initializing:
|
|
59
|
+
|
|
60
|
+
```bash
|
|
61
|
+
# Offset all ports by 100
|
|
62
|
+
container-superposition --port-offset 100
|
|
63
|
+
|
|
64
|
+
# SQL Server will be on 1533 instead of 1433
|
|
65
|
+
```
|
|
66
|
+
|
|
67
|
+
## Connection Information
|
|
68
|
+
|
|
69
|
+
### From Development Container
|
|
70
|
+
|
|
71
|
+
```bash
|
|
72
|
+
# Hostname: sqlserver (Docker Compose service name)
|
|
73
|
+
# Port: 1433
|
|
74
|
+
# Username: sa
|
|
75
|
+
# Password: YourStrong@Passw0rd (or value from .env)
|
|
76
|
+
|
|
77
|
+
# Connection string (ADO.NET)
|
|
78
|
+
Server=sqlserver,1433;Database=master;User Id=sa;Password=YourStrong@Passw0rd;TrustServerCertificate=True;
|
|
79
|
+
|
|
80
|
+
# Connection string (ODBC)
|
|
81
|
+
Driver={ODBC Driver 18 for SQL Server};Server=sqlserver,1433;Database=master;Uid=sa;Pwd=YourStrong@Passw0rd;TrustServerCertificate=yes;
|
|
82
|
+
```
|
|
83
|
+
|
|
84
|
+
### From Host Machine
|
|
85
|
+
|
|
86
|
+
```bash
|
|
87
|
+
# Hostname: localhost
|
|
88
|
+
# Port: 1433 (or 1433 + port-offset)
|
|
89
|
+
# Username: sa
|
|
90
|
+
# Password: YourStrong@Passw0rd
|
|
91
|
+
|
|
92
|
+
# Connection string
|
|
93
|
+
Server=localhost,1433;Database=master;User Id=sa;Password=YourStrong@Passw0rd;TrustServerCertificate=True;
|
|
94
|
+
```
|
|
95
|
+
|
|
96
|
+
### Using VS Code mssql Extension
|
|
97
|
+
|
|
98
|
+
1. Open Command Palette (Ctrl+Shift+P / Cmd+Shift+P)
|
|
99
|
+
2. Select "MS SQL: Connect"
|
|
100
|
+
3. Create a new connection profile:
|
|
101
|
+
- **Server:** sqlserver,1433
|
|
102
|
+
- **Database:** master (or your database name)
|
|
103
|
+
- **Authentication:** SQL Login
|
|
104
|
+
- **User:** sa
|
|
105
|
+
- **Password:** YourStrong@Passw0rd
|
|
106
|
+
- **Save Password:** Yes
|
|
107
|
+
- **Profile Name:** SQL Server Dev
|
|
108
|
+
|
|
109
|
+
## Common Commands
|
|
110
|
+
|
|
111
|
+
### Using VS Code Extension
|
|
112
|
+
|
|
113
|
+
The MS SQL extension provides:
|
|
114
|
+
|
|
115
|
+
- Query editor with IntelliSense
|
|
116
|
+
- Execute queries (Ctrl+Shift+E / Cmd+Shift+E)
|
|
117
|
+
- View databases and tables in sidebar
|
|
118
|
+
- Generate CREATE scripts
|
|
119
|
+
- Export results to CSV/JSON
|
|
120
|
+
|
|
121
|
+
### Using sqlcmd (in SQL Server container)
|
|
122
|
+
|
|
123
|
+
```bash
|
|
124
|
+
# Execute query via docker exec
|
|
125
|
+
docker exec -it $(docker ps -qf "name=sqlserver") \
|
|
126
|
+
/opt/mssql-tools/bin/sqlcmd \
|
|
127
|
+
-S localhost -U sa -P 'YourStrong@Passw0rd' \
|
|
128
|
+
-Q "SELECT @@VERSION"
|
|
129
|
+
|
|
130
|
+
# Interactive session
|
|
131
|
+
docker exec -it $(docker ps -qf "name=sqlserver") \
|
|
132
|
+
/opt/mssql-tools/bin/sqlcmd \
|
|
133
|
+
-S localhost -U sa -P 'YourStrong@Passw0rd'
|
|
134
|
+
```
|
|
135
|
+
|
|
136
|
+
### Database Operations
|
|
137
|
+
|
|
138
|
+
```sql
|
|
139
|
+
-- Show databases
|
|
140
|
+
SELECT name FROM sys.databases;
|
|
141
|
+
|
|
142
|
+
-- Create database
|
|
143
|
+
CREATE DATABASE MyApp;
|
|
144
|
+
|
|
145
|
+
-- Use database
|
|
146
|
+
USE MyApp;
|
|
147
|
+
|
|
148
|
+
-- Create table
|
|
149
|
+
CREATE TABLE Users (
|
|
150
|
+
Id INT IDENTITY(1,1) PRIMARY KEY,
|
|
151
|
+
Name NVARCHAR(100),
|
|
152
|
+
Email NVARCHAR(100) UNIQUE
|
|
153
|
+
);
|
|
154
|
+
|
|
155
|
+
-- Insert data
|
|
156
|
+
INSERT INTO Users (Name, Email) VALUES ('Alice', 'alice@example.com');
|
|
157
|
+
|
|
158
|
+
-- Query data
|
|
159
|
+
SELECT * FROM Users;
|
|
160
|
+
|
|
161
|
+
-- Drop database
|
|
162
|
+
DROP DATABASE MyApp;
|
|
163
|
+
```
|
|
164
|
+
|
|
165
|
+
### Backup and Restore
|
|
166
|
+
|
|
167
|
+
```sql
|
|
168
|
+
-- Backup database
|
|
169
|
+
BACKUP DATABASE MyApp
|
|
170
|
+
TO DISK = '/var/opt/mssql/data/MyApp.bak'
|
|
171
|
+
WITH FORMAT;
|
|
172
|
+
|
|
173
|
+
-- Restore database
|
|
174
|
+
RESTORE DATABASE MyApp
|
|
175
|
+
FROM DISK = '/var/opt/mssql/data/MyApp.bak'
|
|
176
|
+
WITH REPLACE;
|
|
177
|
+
```
|
|
178
|
+
|
|
179
|
+
### Container Management
|
|
180
|
+
|
|
181
|
+
```bash
|
|
182
|
+
# Check service status
|
|
183
|
+
docker-compose ps
|
|
184
|
+
|
|
185
|
+
# View SQL Server logs
|
|
186
|
+
docker-compose logs -f sqlserver
|
|
187
|
+
|
|
188
|
+
# Restart service
|
|
189
|
+
docker-compose restart sqlserver
|
|
190
|
+
|
|
191
|
+
# Stop service
|
|
192
|
+
docker-compose stop sqlserver
|
|
193
|
+
|
|
194
|
+
# Remove data (WARNING: destroys all data)
|
|
195
|
+
docker-compose down -v
|
|
196
|
+
```
|
|
197
|
+
|
|
198
|
+
## Application Integration
|
|
199
|
+
|
|
200
|
+
### .NET (C#)
|
|
201
|
+
|
|
202
|
+
```bash
|
|
203
|
+
# Install SQL Server client
|
|
204
|
+
dotnet add package Microsoft.Data.SqlClient
|
|
205
|
+
```
|
|
206
|
+
|
|
207
|
+
```csharp
|
|
208
|
+
using Microsoft.Data.SqlClient;
|
|
209
|
+
|
|
210
|
+
var connectionString = "Server=sqlserver,1433;Database=MyApp;User Id=sa;Password=YourStrong@Passw0rd;TrustServerCertificate=True;";
|
|
211
|
+
|
|
212
|
+
using var connection = new SqlConnection(connectionString);
|
|
213
|
+
await connection.OpenAsync();
|
|
214
|
+
|
|
215
|
+
// Query
|
|
216
|
+
using var command = new SqlCommand("SELECT * FROM Users", connection);
|
|
217
|
+
using var reader = await command.ExecuteReaderAsync();
|
|
218
|
+
while (await reader.ReadAsync())
|
|
219
|
+
{
|
|
220
|
+
Console.WriteLine($"{reader["Name"]}: {reader["Email"]}");
|
|
221
|
+
}
|
|
222
|
+
|
|
223
|
+
// Insert
|
|
224
|
+
var insertCmd = new SqlCommand(
|
|
225
|
+
"INSERT INTO Users (Name, Email) VALUES (@Name, @Email)",
|
|
226
|
+
connection
|
|
227
|
+
);
|
|
228
|
+
insertCmd.Parameters.AddWithValue("@Name", "Alice");
|
|
229
|
+
insertCmd.Parameters.AddWithValue("@Email", "alice@example.com");
|
|
230
|
+
await insertCmd.ExecuteNonQueryAsync();
|
|
231
|
+
```
|
|
232
|
+
|
|
233
|
+
### .NET (Entity Framework Core)
|
|
234
|
+
|
|
235
|
+
```bash
|
|
236
|
+
# Install EF Core SQL Server provider
|
|
237
|
+
dotnet add package Microsoft.EntityFrameworkCore.SqlServer
|
|
238
|
+
dotnet add package Microsoft.EntityFrameworkCore.Tools
|
|
239
|
+
```
|
|
240
|
+
|
|
241
|
+
```csharp
|
|
242
|
+
using Microsoft.EntityFrameworkCore;
|
|
243
|
+
|
|
244
|
+
public class AppDbContext : DbContext
|
|
245
|
+
{
|
|
246
|
+
public DbSet<User> Users { get; set; }
|
|
247
|
+
|
|
248
|
+
protected override void OnConfiguring(DbContextOptionsBuilder options)
|
|
249
|
+
{
|
|
250
|
+
options.UseSqlServer(
|
|
251
|
+
"Server=sqlserver,1433;Database=MyApp;User Id=sa;Password=YourStrong@Passw0rd;TrustServerCertificate=True;"
|
|
252
|
+
);
|
|
253
|
+
}
|
|
254
|
+
}
|
|
255
|
+
|
|
256
|
+
public class User
|
|
257
|
+
{
|
|
258
|
+
public int Id { get; set; }
|
|
259
|
+
public string Name { get; set; }
|
|
260
|
+
public string Email { get; set; }
|
|
261
|
+
}
|
|
262
|
+
|
|
263
|
+
// Usage
|
|
264
|
+
using var db = new AppDbContext();
|
|
265
|
+
await db.Database.EnsureCreatedAsync();
|
|
266
|
+
|
|
267
|
+
db.Users.Add(new User { Name = "Alice", Email = "alice@example.com" });
|
|
268
|
+
await db.SaveChangesAsync();
|
|
269
|
+
|
|
270
|
+
var users = await db.Users.ToListAsync();
|
|
271
|
+
```
|
|
272
|
+
|
|
273
|
+
### Node.js
|
|
274
|
+
|
|
275
|
+
```bash
|
|
276
|
+
# Install SQL Server driver
|
|
277
|
+
npm install mssql
|
|
278
|
+
```
|
|
279
|
+
|
|
280
|
+
```javascript
|
|
281
|
+
const sql = require('mssql');
|
|
282
|
+
|
|
283
|
+
const config = {
|
|
284
|
+
server: 'sqlserver',
|
|
285
|
+
port: 1433,
|
|
286
|
+
database: 'MyApp',
|
|
287
|
+
user: 'sa',
|
|
288
|
+
password: 'YourStrong@Passw0rd',
|
|
289
|
+
options: {
|
|
290
|
+
trustServerCertificate: true,
|
|
291
|
+
enableArithAbort: true,
|
|
292
|
+
},
|
|
293
|
+
};
|
|
294
|
+
|
|
295
|
+
async function main() {
|
|
296
|
+
const pool = await sql.connect(config);
|
|
297
|
+
|
|
298
|
+
// Query
|
|
299
|
+
const result = await pool.request().query('SELECT * FROM Users');
|
|
300
|
+
console.log(result.recordset);
|
|
301
|
+
|
|
302
|
+
// Insert
|
|
303
|
+
await pool
|
|
304
|
+
.request()
|
|
305
|
+
.input('name', sql.NVarChar, 'Alice')
|
|
306
|
+
.input('email', sql.NVarChar, 'alice@example.com')
|
|
307
|
+
.query('INSERT INTO Users (Name, Email) VALUES (@name, @email)');
|
|
308
|
+
|
|
309
|
+
await pool.close();
|
|
310
|
+
}
|
|
311
|
+
|
|
312
|
+
main();
|
|
313
|
+
```
|
|
314
|
+
|
|
315
|
+
### Python
|
|
316
|
+
|
|
317
|
+
```bash
|
|
318
|
+
# Install pyodbc
|
|
319
|
+
pip install pyodbc
|
|
320
|
+
```
|
|
321
|
+
|
|
322
|
+
```python
|
|
323
|
+
import pyodbc
|
|
324
|
+
|
|
325
|
+
# Connect
|
|
326
|
+
conn = pyodbc.connect(
|
|
327
|
+
'DRIVER={ODBC Driver 18 for SQL Server};'
|
|
328
|
+
'SERVER=sqlserver,1433;'
|
|
329
|
+
'DATABASE=MyApp;'
|
|
330
|
+
'UID=sa;'
|
|
331
|
+
'PWD=YourStrong@Passw0rd;'
|
|
332
|
+
'TrustServerCertificate=yes;'
|
|
333
|
+
)
|
|
334
|
+
|
|
335
|
+
cursor = conn.cursor()
|
|
336
|
+
|
|
337
|
+
# Query
|
|
338
|
+
cursor.execute('SELECT * FROM Users')
|
|
339
|
+
for row in cursor.fetchall():
|
|
340
|
+
print(row)
|
|
341
|
+
|
|
342
|
+
# Insert
|
|
343
|
+
cursor.execute(
|
|
344
|
+
'INSERT INTO Users (Name, Email) VALUES (?, ?)',
|
|
345
|
+
'Alice', 'alice@example.com'
|
|
346
|
+
)
|
|
347
|
+
conn.commit()
|
|
348
|
+
|
|
349
|
+
# Close
|
|
350
|
+
cursor.close()
|
|
351
|
+
conn.close()
|
|
352
|
+
```
|
|
353
|
+
|
|
354
|
+
### Go
|
|
355
|
+
|
|
356
|
+
```bash
|
|
357
|
+
# Install SQL Server driver
|
|
358
|
+
go get github.com/denisenkom/go-mssqldb
|
|
359
|
+
```
|
|
360
|
+
|
|
361
|
+
```go
|
|
362
|
+
package main
|
|
363
|
+
|
|
364
|
+
import (
|
|
365
|
+
"database/sql"
|
|
366
|
+
_ "github.com/denisenkom/go-mssqldb"
|
|
367
|
+
)
|
|
368
|
+
|
|
369
|
+
func main() {
|
|
370
|
+
connString := "sqlserver://sa:YourStrong@Passw0rd@sqlserver:1433?database=MyApp&TrustServerCertificate=true"
|
|
371
|
+
|
|
372
|
+
db, _ := sql.Open("sqlserver", connString)
|
|
373
|
+
defer db.Close()
|
|
374
|
+
|
|
375
|
+
// Query
|
|
376
|
+
rows, _ := db.Query("SELECT * FROM Users")
|
|
377
|
+
defer rows.Close()
|
|
378
|
+
|
|
379
|
+
for rows.Next() {
|
|
380
|
+
var name, email string
|
|
381
|
+
rows.Scan(&name, &email)
|
|
382
|
+
println(name, email)
|
|
383
|
+
}
|
|
384
|
+
|
|
385
|
+
// Insert
|
|
386
|
+
db.Exec("INSERT INTO Users (Name, Email) VALUES (@p1, @p2)",
|
|
387
|
+
"Alice", "alice@example.com")
|
|
388
|
+
}
|
|
389
|
+
```
|
|
390
|
+
|
|
391
|
+
## Use Cases
|
|
392
|
+
|
|
393
|
+
- **.NET applications** - First-class integration with .NET ecosystem
|
|
394
|
+
- **Enterprise applications** - Proven for large-scale deployments
|
|
395
|
+
- **Microsoft stack** - Azure, Power BI, SSIS integration
|
|
396
|
+
- **Windows legacy apps** - Compatibility with existing systems
|
|
397
|
+
- **Stored procedures** - Advanced T-SQL programming
|
|
398
|
+
- **Business intelligence** - SSRS, SSAS integration
|
|
399
|
+
|
|
400
|
+
**Integrates well with:**
|
|
401
|
+
|
|
402
|
+
- .NET (dotnet overlay) - Primary development platform
|
|
403
|
+
- Azure CLI (azure-cli overlay) - Cloud deployment
|
|
404
|
+
- Grafana (grafana overlay) - Database metrics visualization
|
|
405
|
+
- OTEL Collector (otel-collector overlay) - Performance monitoring
|
|
406
|
+
|
|
407
|
+
## Troubleshooting
|
|
408
|
+
|
|
409
|
+
### Issue: Cannot connect to SQL Server
|
|
410
|
+
|
|
411
|
+
**Symptoms:**
|
|
412
|
+
|
|
413
|
+
- Connection refused errors
|
|
414
|
+
- Timeout when connecting
|
|
415
|
+
|
|
416
|
+
**Solution:**
|
|
417
|
+
|
|
418
|
+
```bash
|
|
419
|
+
# Check if service is running
|
|
420
|
+
docker-compose ps
|
|
421
|
+
|
|
422
|
+
# SQL Server can take 30-60 seconds to start
|
|
423
|
+
# Check logs for "SQL Server is now ready for client connections"
|
|
424
|
+
docker-compose logs sqlserver | grep "ready for client connections"
|
|
425
|
+
|
|
426
|
+
# Wait for health check to pass
|
|
427
|
+
docker-compose ps | grep sqlserver
|
|
428
|
+
# Look for "healthy" status
|
|
429
|
+
|
|
430
|
+
# Test connection via docker exec
|
|
431
|
+
docker exec -it $(docker ps -qf "name=sqlserver") \
|
|
432
|
+
/opt/mssql-tools/bin/sqlcmd \
|
|
433
|
+
-S localhost -U sa -P 'YourStrong@Passw0rd' \
|
|
434
|
+
-Q "SELECT 1"
|
|
435
|
+
```
|
|
436
|
+
|
|
437
|
+
### Issue: Login failed for user 'sa'
|
|
438
|
+
|
|
439
|
+
**Symptoms:**
|
|
440
|
+
|
|
441
|
+
- "Login failed for user 'sa'"
|
|
442
|
+
- Authentication errors
|
|
443
|
+
|
|
444
|
+
**Solution:**
|
|
445
|
+
|
|
446
|
+
```bash
|
|
447
|
+
# Verify password in .env file
|
|
448
|
+
cat .devcontainer/.env
|
|
449
|
+
|
|
450
|
+
# Ensure password meets requirements (8+ chars, uppercase, lowercase, digit, special)
|
|
451
|
+
|
|
452
|
+
# If changing password, recreate containers
|
|
453
|
+
docker-compose down -v
|
|
454
|
+
docker-compose up -d
|
|
455
|
+
```
|
|
456
|
+
|
|
457
|
+
### Issue: TrustServerCertificate error
|
|
458
|
+
|
|
459
|
+
**Symptoms:**
|
|
460
|
+
|
|
461
|
+
- "The certificate chain was issued by an authority that is not trusted"
|
|
462
|
+
|
|
463
|
+
**Solution:**
|
|
464
|
+
|
|
465
|
+
```bash
|
|
466
|
+
# Add TrustServerCertificate=True to connection string
|
|
467
|
+
# Or use TrustServerCertificate=yes for ODBC
|
|
468
|
+
|
|
469
|
+
# Example:
|
|
470
|
+
# Server=sqlserver,1433;Database=MyApp;User Id=sa;Password=YourStrong@Passw0rd;TrustServerCertificate=True;
|
|
471
|
+
```
|
|
472
|
+
|
|
473
|
+
### Issue: Database not found
|
|
474
|
+
|
|
475
|
+
**Symptoms:**
|
|
476
|
+
|
|
477
|
+
- "Cannot open database 'MyApp' requested by the login"
|
|
478
|
+
|
|
479
|
+
**Solution:**
|
|
480
|
+
|
|
481
|
+
```sql
|
|
482
|
+
-- Connect to master database first
|
|
483
|
+
-- Then create your database
|
|
484
|
+
CREATE DATABASE MyApp;
|
|
485
|
+
USE MyApp;
|
|
486
|
+
```
|
|
487
|
+
|
|
488
|
+
### Issue: Data not persisting
|
|
489
|
+
|
|
490
|
+
**Symptoms:**
|
|
491
|
+
|
|
492
|
+
- Data lost after container restart
|
|
493
|
+
|
|
494
|
+
**Solution:**
|
|
495
|
+
|
|
496
|
+
```bash
|
|
497
|
+
# Verify volumes exist
|
|
498
|
+
docker volume ls | grep sqlserver
|
|
499
|
+
|
|
500
|
+
# Check volume mounts in docker-compose.yml
|
|
501
|
+
docker-compose config
|
|
502
|
+
|
|
503
|
+
# Don't use 'docker-compose down -v' unless you want to delete data
|
|
504
|
+
# Use 'docker-compose down' or 'docker-compose stop' instead
|
|
505
|
+
```
|
|
506
|
+
|
|
507
|
+
### Issue: Container exits immediately
|
|
508
|
+
|
|
509
|
+
**Symptoms:**
|
|
510
|
+
|
|
511
|
+
- SQL Server container keeps restarting
|
|
512
|
+
|
|
513
|
+
**Solution:**
|
|
514
|
+
|
|
515
|
+
```bash
|
|
516
|
+
# Check logs for error messages
|
|
517
|
+
docker-compose logs sqlserver
|
|
518
|
+
|
|
519
|
+
# Common issue: EULA not accepted
|
|
520
|
+
# Solution: ACCEPT_EULA=Y is already set in docker-compose.yml
|
|
521
|
+
|
|
522
|
+
# Common issue: Insufficient resources
|
|
523
|
+
# SQL Server requires at least 2GB RAM
|
|
524
|
+
# Check Docker Desktop resource settings
|
|
525
|
+
```
|
|
526
|
+
|
|
527
|
+
## Security Considerations
|
|
528
|
+
|
|
529
|
+
⚠️ **Development-only defaults:**
|
|
530
|
+
|
|
531
|
+
- Default SA password is intentionally visible for development
|
|
532
|
+
- SQL Server is exposed on host port (accessible from host machine)
|
|
533
|
+
- TrustServerCertificate is enabled (skips certificate validation)
|
|
534
|
+
|
|
535
|
+
**For production:**
|
|
536
|
+
|
|
537
|
+
1. **Change SA password:**
|
|
538
|
+
|
|
539
|
+
```bash
|
|
540
|
+
# Use strong password meeting complexity requirements
|
|
541
|
+
MSSQL_SA_PASSWORD=<ComplexPassword123!>
|
|
542
|
+
```
|
|
543
|
+
|
|
544
|
+
2. **Create application-specific users:**
|
|
545
|
+
|
|
546
|
+
```sql
|
|
547
|
+
-- Don't use SA for applications
|
|
548
|
+
CREATE LOGIN appuser WITH PASSWORD = 'ComplexPassword123!';
|
|
549
|
+
CREATE USER appuser FOR LOGIN appuser;
|
|
550
|
+
GRANT SELECT, INSERT, UPDATE, DELETE ON DATABASE::MyApp TO appuser;
|
|
551
|
+
```
|
|
552
|
+
|
|
553
|
+
3. **Restrict network access:**
|
|
554
|
+
- Don't expose ports publicly
|
|
555
|
+
- Use firewall rules
|
|
556
|
+
- Enable TLS/SSL encryption
|
|
557
|
+
|
|
558
|
+
4. **Use Windows Authentication (if applicable):**
|
|
559
|
+
- Configure Active Directory integration
|
|
560
|
+
- Disable SQL authentication for production
|
|
561
|
+
|
|
562
|
+
5. **Enable auditing:**
|
|
563
|
+
```sql
|
|
564
|
+
-- Enable server audit
|
|
565
|
+
CREATE SERVER AUDIT MyAudit TO FILE (FILEPATH = '/var/opt/mssql/audit/');
|
|
566
|
+
ALTER SERVER AUDIT MyAudit WITH (STATE = ON);
|
|
567
|
+
```
|
|
568
|
+
|
|
569
|
+
## Related Overlays
|
|
570
|
+
|
|
571
|
+
- **dotnet** - .NET SDK with C# DevKit (recommended)
|
|
572
|
+
- **azure-cli** - Azure deployment and management
|
|
573
|
+
- **grafana** - Visualize SQL Server metrics
|
|
574
|
+
- **otel-collector** - Monitor SQL Server performance
|
|
575
|
+
|
|
576
|
+
## Additional Resources
|
|
577
|
+
|
|
578
|
+
- [Official SQL Server on Linux Documentation](https://docs.microsoft.com/en-us/sql/linux/)
|
|
579
|
+
- [SQL Server Docker Image](https://hub.docker.com/_/microsoft-mssql-server)
|
|
580
|
+
- [VS Code mssql Extension](https://marketplace.visualstudio.com/items?itemName=ms-mssql.mssql)
|
|
581
|
+
- [T-SQL Reference](https://docs.microsoft.com/en-us/sql/t-sql/)
|
|
582
|
+
- [Entity Framework Core](https://docs.microsoft.com/en-us/ef/core/)
|
|
583
|
+
|
|
584
|
+
## Notes
|
|
585
|
+
|
|
586
|
+
- SQL Server uses the hostname `sqlserver` (the service name) for container-to-container communication
|
|
587
|
+
- Data is persisted in a Docker volume (`sqlserver-data`)
|
|
588
|
+
- The Developer Edition is fully featured and free for development/testing
|
|
589
|
+
- SQL Server 2022 for Linux has excellent performance and feature parity with Windows
|
|
590
|
+
- Health checks include a 30-second start period as SQL Server takes time to initialize
|
|
591
|
+
- The VS Code mssql extension provides an excellent development experience
|
|
592
|
+
- **Inevitable for .NET developers** - SQL Server is the natural choice for .NET applications
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
{
|
|
2
|
+
"$schema": "https://raw.githubusercontent.com/devcontainers/spec/main/schemas/devContainer.base.schema.json",
|
|
3
|
+
"customizations": {
|
|
4
|
+
"vscode": {
|
|
5
|
+
"extensions": ["ms-mssql.mssql"]
|
|
6
|
+
}
|
|
7
|
+
},
|
|
8
|
+
"runServices": ["sqlserver"],
|
|
9
|
+
"forwardPorts": [1433],
|
|
10
|
+
"portsAttributes": {
|
|
11
|
+
"1433": {
|
|
12
|
+
"label": "SQL Server",
|
|
13
|
+
"onAutoForward": "notify"
|
|
14
|
+
}
|
|
15
|
+
},
|
|
16
|
+
"remoteEnv": {
|
|
17
|
+
"MSSQL_HOST": "sqlserver",
|
|
18
|
+
"MSSQL_PORT": "1433",
|
|
19
|
+
"MSSQL_SA_PASSWORD": "YourStrong@Passw0rd",
|
|
20
|
+
"MSSQL_DATABASE": "master"
|
|
21
|
+
}
|
|
22
|
+
}
|
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
version: '3.8'
|
|
2
|
+
|
|
3
|
+
services:
|
|
4
|
+
sqlserver:
|
|
5
|
+
image: mcr.microsoft.com/mssql/server:${MSSQL_VERSION:-2022-latest}
|
|
6
|
+
restart: unless-stopped
|
|
7
|
+
volumes:
|
|
8
|
+
- sqlserver-data:/var/opt/mssql
|
|
9
|
+
environment:
|
|
10
|
+
ACCEPT_EULA: Y
|
|
11
|
+
MSSQL_SA_PASSWORD: ${MSSQL_SA_PASSWORD:-YourStrong@Passw0rd}
|
|
12
|
+
MSSQL_PID: ${MSSQL_PID:-Developer}
|
|
13
|
+
ports:
|
|
14
|
+
- '${MSSQL_PORT:-1433}:1433'
|
|
15
|
+
networks:
|
|
16
|
+
- devnet
|
|
17
|
+
healthcheck:
|
|
18
|
+
test:
|
|
19
|
+
[
|
|
20
|
+
'CMD-SHELL',
|
|
21
|
+
"/opt/mssql-tools/bin/sqlcmd -S localhost -U sa -P '${MSSQL_SA_PASSWORD:-YourStrong@Passw0rd}' -Q 'SELECT 1' || exit 1",
|
|
22
|
+
]
|
|
23
|
+
interval: 10s
|
|
24
|
+
timeout: 5s
|
|
25
|
+
retries: 5
|
|
26
|
+
start_period: 30s
|
|
27
|
+
|
|
28
|
+
volumes:
|
|
29
|
+
sqlserver-data:
|
|
30
|
+
|
|
31
|
+
networks:
|
|
32
|
+
devnet:
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
id: sqlserver
|
|
2
|
+
name: SQL Server
|
|
3
|
+
description: SQL Server 2022 for Linux
|
|
4
|
+
category: database
|
|
5
|
+
supports:
|
|
6
|
+
- compose
|
|
7
|
+
requires: []
|
|
8
|
+
suggests:
|
|
9
|
+
- dotnet
|
|
10
|
+
conflicts: []
|
|
11
|
+
tags:
|
|
12
|
+
- database
|
|
13
|
+
- sql
|
|
14
|
+
- sqlserver
|
|
15
|
+
- microsoft
|
|
16
|
+
ports:
|
|
17
|
+
- 1433
|
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
#!/bin/bash
|
|
2
|
+
# Verification script for SQL Server overlay
|
|
3
|
+
# Confirms SQL Server service is accessible
|
|
4
|
+
|
|
5
|
+
set -e
|
|
6
|
+
|
|
7
|
+
echo "🔍 Verifying SQL Server overlay..."
|
|
8
|
+
echo ""
|
|
9
|
+
|
|
10
|
+
# Check if SQL Server service is running
|
|
11
|
+
echo "1️⃣ Checking SQL Server service..."
|
|
12
|
+
SQLSERVER_READY=false
|
|
13
|
+
for i in {1..30}; do
|
|
14
|
+
# Try to connect using docker exec (sqlcmd is in the container, not necessarily in dev container)
|
|
15
|
+
if docker exec $(docker ps -qf "name=sqlserver") /opt/mssql-tools/bin/sqlcmd -S localhost -U sa -P 'YourStrong@Passw0rd' -Q "SELECT 1" &> /dev/null; then
|
|
16
|
+
echo " ✅ SQL Server service is ready"
|
|
17
|
+
SQLSERVER_READY=true
|
|
18
|
+
break
|
|
19
|
+
fi
|
|
20
|
+
sleep 2
|
|
21
|
+
done
|
|
22
|
+
|
|
23
|
+
if [ "$SQLSERVER_READY" = false ]; then
|
|
24
|
+
echo " ❌ SQL Server service not ready after 60 seconds"
|
|
25
|
+
echo " ⚠️ SQL Server can take 30-60 seconds to start"
|
|
26
|
+
exit 1
|
|
27
|
+
fi
|
|
28
|
+
|
|
29
|
+
echo ""
|
|
30
|
+
echo "✅ SQL Server overlay verification complete"
|