dojo.md 0.2.0 → 0.2.2

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.
Files changed (225) hide show
  1. package/courses/GENERATION_LOG.md +45 -0
  2. package/courses/aws-lambda-debugging/course.yaml +11 -0
  3. package/courses/aws-lambda-debugging/scenarios/level-1/api-gateway-integration.yaml +71 -0
  4. package/courses/aws-lambda-debugging/scenarios/level-1/cloudwatch-logs-basics.yaml +64 -0
  5. package/courses/aws-lambda-debugging/scenarios/level-1/cold-start-basics.yaml +70 -0
  6. package/courses/aws-lambda-debugging/scenarios/level-1/environment-variable-issues.yaml +72 -0
  7. package/courses/aws-lambda-debugging/scenarios/level-1/first-debugging-shift.yaml +73 -0
  8. package/courses/aws-lambda-debugging/scenarios/level-1/handler-import-errors.yaml +71 -0
  9. package/courses/aws-lambda-debugging/scenarios/level-1/iam-permission-errors.yaml +68 -0
  10. package/courses/aws-lambda-debugging/scenarios/level-1/invocation-errors.yaml +72 -0
  11. package/courses/aws-lambda-debugging/scenarios/level-1/lambda-timeout-errors.yaml +65 -0
  12. package/courses/aws-lambda-debugging/scenarios/level-1/memory-and-oom.yaml +70 -0
  13. package/courses/aws-lambda-debugging/scenarios/level-2/async-invocation-failures.yaml +72 -0
  14. package/courses/aws-lambda-debugging/scenarios/level-2/cold-start-optimization.yaml +76 -0
  15. package/courses/aws-lambda-debugging/scenarios/level-2/dynamodb-streams-debugging.yaml +70 -0
  16. package/courses/aws-lambda-debugging/scenarios/level-2/intermediate-debugging-shift.yaml +71 -0
  17. package/courses/aws-lambda-debugging/scenarios/level-2/lambda-concurrency-management.yaml +70 -0
  18. package/courses/aws-lambda-debugging/scenarios/level-2/lambda-layers-debugging.yaml +76 -0
  19. package/courses/aws-lambda-debugging/scenarios/level-2/sam-local-debugging.yaml +74 -0
  20. package/courses/aws-lambda-debugging/scenarios/level-2/sqs-event-source.yaml +72 -0
  21. package/courses/aws-lambda-debugging/scenarios/level-2/vpc-networking-issues.yaml +71 -0
  22. package/courses/aws-lambda-debugging/scenarios/level-2/xray-tracing.yaml +62 -0
  23. package/courses/aws-lambda-debugging/scenarios/level-3/advanced-debugging-shift.yaml +72 -0
  24. package/courses/aws-lambda-debugging/scenarios/level-3/container-image-lambda.yaml +79 -0
  25. package/courses/aws-lambda-debugging/scenarios/level-3/cross-account-invocation.yaml +72 -0
  26. package/courses/aws-lambda-debugging/scenarios/level-3/eventbridge-patterns.yaml +79 -0
  27. package/courses/aws-lambda-debugging/scenarios/level-3/iac-deployment-debugging.yaml +68 -0
  28. package/courses/aws-lambda-debugging/scenarios/level-3/kinesis-stream-processing.yaml +64 -0
  29. package/courses/aws-lambda-debugging/scenarios/level-3/lambda-at-edge.yaml +64 -0
  30. package/courses/aws-lambda-debugging/scenarios/level-3/lambda-extensions-debugging.yaml +67 -0
  31. package/courses/aws-lambda-debugging/scenarios/level-3/powertools-observability.yaml +79 -0
  32. package/courses/aws-lambda-debugging/scenarios/level-3/step-functions-debugging.yaml +80 -0
  33. package/courses/aws-lambda-debugging/scenarios/level-4/cost-optimization-strategy.yaml +67 -0
  34. package/courses/aws-lambda-debugging/scenarios/level-4/expert-debugging-shift.yaml +62 -0
  35. package/courses/aws-lambda-debugging/scenarios/level-4/incident-management-serverless.yaml +61 -0
  36. package/courses/aws-lambda-debugging/scenarios/level-4/multi-region-serverless.yaml +67 -0
  37. package/courses/aws-lambda-debugging/scenarios/level-4/observability-platform-design.yaml +71 -0
  38. package/courses/aws-lambda-debugging/scenarios/level-4/serverless-architecture-design.yaml +64 -0
  39. package/courses/aws-lambda-debugging/scenarios/level-4/serverless-data-architecture.yaml +66 -0
  40. package/courses/aws-lambda-debugging/scenarios/level-4/serverless-migration-strategy.yaml +65 -0
  41. package/courses/aws-lambda-debugging/scenarios/level-4/serverless-security-design.yaml +60 -0
  42. package/courses/aws-lambda-debugging/scenarios/level-4/serverless-testing-strategy.yaml +62 -0
  43. package/courses/aws-lambda-debugging/scenarios/level-5/board-serverless-strategy.yaml +63 -0
  44. package/courses/aws-lambda-debugging/scenarios/level-5/consulting-serverless-adoption.yaml +57 -0
  45. package/courses/aws-lambda-debugging/scenarios/level-5/industry-serverless-patterns.yaml +62 -0
  46. package/courses/aws-lambda-debugging/scenarios/level-5/ma-serverless-integration.yaml +75 -0
  47. package/courses/aws-lambda-debugging/scenarios/level-5/master-debugging-shift.yaml +61 -0
  48. package/courses/aws-lambda-debugging/scenarios/level-5/organizational-serverless-transformation.yaml +65 -0
  49. package/courses/aws-lambda-debugging/scenarios/level-5/regulatory-serverless.yaml +61 -0
  50. package/courses/aws-lambda-debugging/scenarios/level-5/serverless-economics.yaml +65 -0
  51. package/courses/aws-lambda-debugging/scenarios/level-5/serverless-future-technology.yaml +66 -0
  52. package/courses/aws-lambda-debugging/scenarios/level-5/serverless-platform-design.yaml +71 -0
  53. package/courses/docker-container-debugging/course.yaml +11 -0
  54. package/courses/docker-container-debugging/scenarios/level-1/container-exit-codes.yaml +59 -0
  55. package/courses/docker-container-debugging/scenarios/level-1/container-networking-basics.yaml +69 -0
  56. package/courses/docker-container-debugging/scenarios/level-1/docker-logs-debugging.yaml +67 -0
  57. package/courses/docker-container-debugging/scenarios/level-1/dockerfile-build-failures.yaml +71 -0
  58. package/courses/docker-container-debugging/scenarios/level-1/environment-variable-issues.yaml +74 -0
  59. package/courses/docker-container-debugging/scenarios/level-1/first-debugging-shift.yaml +70 -0
  60. package/courses/docker-container-debugging/scenarios/level-1/image-pull-failures.yaml +68 -0
  61. package/courses/docker-container-debugging/scenarios/level-1/port-mapping-issues.yaml +67 -0
  62. package/courses/docker-container-debugging/scenarios/level-1/resource-limits-oom.yaml +70 -0
  63. package/courses/docker-container-debugging/scenarios/level-1/volume-mount-problems.yaml +66 -0
  64. package/courses/docker-container-debugging/scenarios/level-2/container-health-checks.yaml +73 -0
  65. package/courses/docker-container-debugging/scenarios/level-2/docker-compose-debugging.yaml +66 -0
  66. package/courses/docker-container-debugging/scenarios/level-2/docker-exec-debugging.yaml +71 -0
  67. package/courses/docker-container-debugging/scenarios/level-2/image-layer-optimization.yaml +81 -0
  68. package/courses/docker-container-debugging/scenarios/level-2/intermediate-debugging-shift.yaml +73 -0
  69. package/courses/docker-container-debugging/scenarios/level-2/logging-and-log-rotation.yaml +76 -0
  70. package/courses/docker-container-debugging/scenarios/level-2/multi-stage-build-debugging.yaml +76 -0
  71. package/courses/docker-container-debugging/scenarios/level-2/network-debugging-tools.yaml +67 -0
  72. package/courses/docker-container-debugging/scenarios/level-2/pid1-signal-handling.yaml +71 -0
  73. package/courses/docker-container-debugging/scenarios/level-2/security-scanning-basics.yaml +67 -0
  74. package/courses/docker-container-debugging/scenarios/level-3/advanced-debugging-shift.yaml +77 -0
  75. package/courses/docker-container-debugging/scenarios/level-3/buildkit-optimization.yaml +67 -0
  76. package/courses/docker-container-debugging/scenarios/level-3/container-filesystem-debugging.yaml +70 -0
  77. package/courses/docker-container-debugging/scenarios/level-3/container-security-hardening.yaml +74 -0
  78. package/courses/docker-container-debugging/scenarios/level-3/disk-space-management.yaml +74 -0
  79. package/courses/docker-container-debugging/scenarios/level-3/docker-api-automation.yaml +72 -0
  80. package/courses/docker-container-debugging/scenarios/level-3/docker-daemon-issues.yaml +73 -0
  81. package/courses/docker-container-debugging/scenarios/level-3/docker-in-docker-ci.yaml +69 -0
  82. package/courses/docker-container-debugging/scenarios/level-3/overlay-network-debugging.yaml +70 -0
  83. package/courses/docker-container-debugging/scenarios/level-3/production-container-ops.yaml +71 -0
  84. package/courses/docker-container-debugging/scenarios/level-4/cicd-pipeline-design.yaml +66 -0
  85. package/courses/docker-container-debugging/scenarios/level-4/container-monitoring-observability.yaml +63 -0
  86. package/courses/docker-container-debugging/scenarios/level-4/container-orchestration-strategy.yaml +62 -0
  87. package/courses/docker-container-debugging/scenarios/level-4/container-performance-engineering.yaml +64 -0
  88. package/courses/docker-container-debugging/scenarios/level-4/container-security-architecture.yaml +66 -0
  89. package/courses/docker-container-debugging/scenarios/level-4/enterprise-image-management.yaml +58 -0
  90. package/courses/docker-container-debugging/scenarios/level-4/expert-debugging-shift.yaml +63 -0
  91. package/courses/docker-container-debugging/scenarios/level-4/incident-response-containers.yaml +70 -0
  92. package/courses/docker-container-debugging/scenarios/level-4/multi-environment-management.yaml +65 -0
  93. package/courses/docker-container-debugging/scenarios/level-4/stateful-service-containers.yaml +65 -0
  94. package/courses/docker-container-debugging/scenarios/level-5/board-infrastructure-strategy.yaml +58 -0
  95. package/courses/docker-container-debugging/scenarios/level-5/consulting-container-strategy.yaml +61 -0
  96. package/courses/docker-container-debugging/scenarios/level-5/container-platform-architecture.yaml +67 -0
  97. package/courses/docker-container-debugging/scenarios/level-5/container-platform-economics.yaml +67 -0
  98. package/courses/docker-container-debugging/scenarios/level-5/container-technology-evolution.yaml +67 -0
  99. package/courses/docker-container-debugging/scenarios/level-5/disaster-recovery-containers.yaml +66 -0
  100. package/courses/docker-container-debugging/scenarios/level-5/industry-container-patterns.yaml +71 -0
  101. package/courses/docker-container-debugging/scenarios/level-5/master-debugging-shift.yaml +62 -0
  102. package/courses/docker-container-debugging/scenarios/level-5/organizational-transformation.yaml +67 -0
  103. package/courses/docker-container-debugging/scenarios/level-5/regulatory-compliance-containers.yaml +61 -0
  104. package/courses/kubernetes-deployment-troubleshooting/course.yaml +12 -0
  105. package/courses/kubernetes-deployment-troubleshooting/scenarios/level-1/configmap-secret-issues.yaml +69 -0
  106. package/courses/kubernetes-deployment-troubleshooting/scenarios/level-1/crashloopbackoff.yaml +68 -0
  107. package/courses/kubernetes-deployment-troubleshooting/scenarios/level-1/deployment-rollout.yaml +56 -0
  108. package/courses/kubernetes-deployment-troubleshooting/scenarios/level-1/first-troubleshooting-shift.yaml +65 -0
  109. package/courses/kubernetes-deployment-troubleshooting/scenarios/level-1/health-probe-failures.yaml +70 -0
  110. package/courses/kubernetes-deployment-troubleshooting/scenarios/level-1/imagepullbackoff.yaml +57 -0
  111. package/courses/kubernetes-deployment-troubleshooting/scenarios/level-1/kubectl-debugging-basics.yaml +56 -0
  112. package/courses/kubernetes-deployment-troubleshooting/scenarios/level-1/oomkilled.yaml +70 -0
  113. package/courses/kubernetes-deployment-troubleshooting/scenarios/level-1/pending-pods.yaml +68 -0
  114. package/courses/kubernetes-deployment-troubleshooting/scenarios/level-1/service-not-reachable.yaml +66 -0
  115. package/courses/kubernetes-deployment-troubleshooting/scenarios/level-2/dns-resolution-failures.yaml +63 -0
  116. package/courses/kubernetes-deployment-troubleshooting/scenarios/level-2/helm-deployment-failures.yaml +63 -0
  117. package/courses/kubernetes-deployment-troubleshooting/scenarios/level-2/hpa-scaling-issues.yaml +62 -0
  118. package/courses/kubernetes-deployment-troubleshooting/scenarios/level-2/ingress-routing-issues.yaml +63 -0
  119. package/courses/kubernetes-deployment-troubleshooting/scenarios/level-2/init-container-failures.yaml +63 -0
  120. package/courses/kubernetes-deployment-troubleshooting/scenarios/level-2/intermediate-troubleshooting-shift.yaml +66 -0
  121. package/courses/kubernetes-deployment-troubleshooting/scenarios/level-2/network-policy-blocking.yaml +67 -0
  122. package/courses/kubernetes-deployment-troubleshooting/scenarios/level-2/persistent-volume-issues.yaml +69 -0
  123. package/courses/kubernetes-deployment-troubleshooting/scenarios/level-2/rbac-permission-denied.yaml +57 -0
  124. package/courses/kubernetes-deployment-troubleshooting/scenarios/level-2/resource-quota-limits.yaml +64 -0
  125. package/courses/kubernetes-deployment-troubleshooting/scenarios/level-3/advanced-troubleshooting-shift.yaml +69 -0
  126. package/courses/kubernetes-deployment-troubleshooting/scenarios/level-3/cluster-upgrade-failures.yaml +71 -0
  127. package/courses/kubernetes-deployment-troubleshooting/scenarios/level-3/gitops-drift-detection.yaml +62 -0
  128. package/courses/kubernetes-deployment-troubleshooting/scenarios/level-3/job-cronjob-failures.yaml +67 -0
  129. package/courses/kubernetes-deployment-troubleshooting/scenarios/level-3/monitoring-alerting-gaps.yaml +64 -0
  130. package/courses/kubernetes-deployment-troubleshooting/scenarios/level-3/multi-container-debugging.yaml +68 -0
  131. package/courses/kubernetes-deployment-troubleshooting/scenarios/level-3/node-pressure-evictions.yaml +70 -0
  132. package/courses/kubernetes-deployment-troubleshooting/scenarios/level-3/pod-disruption-budgets.yaml +59 -0
  133. package/courses/kubernetes-deployment-troubleshooting/scenarios/level-3/service-mesh-debugging.yaml +64 -0
  134. package/courses/kubernetes-deployment-troubleshooting/scenarios/level-3/statefulset-troubleshooting.yaml +69 -0
  135. package/courses/kubernetes-deployment-troubleshooting/scenarios/level-4/capacity-planning.yaml +65 -0
  136. package/courses/kubernetes-deployment-troubleshooting/scenarios/level-4/cost-optimization.yaml +57 -0
  137. package/courses/kubernetes-deployment-troubleshooting/scenarios/level-4/disaster-recovery-design.yaml +56 -0
  138. package/courses/kubernetes-deployment-troubleshooting/scenarios/level-4/executive-communication.yaml +62 -0
  139. package/courses/kubernetes-deployment-troubleshooting/scenarios/level-4/expert-troubleshooting-shift.yaml +65 -0
  140. package/courses/kubernetes-deployment-troubleshooting/scenarios/level-4/incident-management-process.yaml +59 -0
  141. package/courses/kubernetes-deployment-troubleshooting/scenarios/level-4/multi-cluster-operations.yaml +62 -0
  142. package/courses/kubernetes-deployment-troubleshooting/scenarios/level-4/multi-tenancy-design.yaml +55 -0
  143. package/courses/kubernetes-deployment-troubleshooting/scenarios/level-4/platform-engineering.yaml +59 -0
  144. package/courses/kubernetes-deployment-troubleshooting/scenarios/level-4/security-hardening.yaml +58 -0
  145. package/courses/kubernetes-deployment-troubleshooting/scenarios/level-5/behavioral-science.yaml +62 -0
  146. package/courses/kubernetes-deployment-troubleshooting/scenarios/level-5/board-strategy.yaml +61 -0
  147. package/courses/kubernetes-deployment-troubleshooting/scenarios/level-5/cloud-native-future.yaml +65 -0
  148. package/courses/kubernetes-deployment-troubleshooting/scenarios/level-5/comprehensive-platform.yaml +57 -0
  149. package/courses/kubernetes-deployment-troubleshooting/scenarios/level-5/consulting-engagement.yaml +62 -0
  150. package/courses/kubernetes-deployment-troubleshooting/scenarios/level-5/industry-benchmarks.yaml +58 -0
  151. package/courses/kubernetes-deployment-troubleshooting/scenarios/level-5/ma-integration.yaml +62 -0
  152. package/courses/kubernetes-deployment-troubleshooting/scenarios/level-5/master-troubleshooting-shift.yaml +73 -0
  153. package/courses/kubernetes-deployment-troubleshooting/scenarios/level-5/product-development.yaml +65 -0
  154. package/courses/kubernetes-deployment-troubleshooting/scenarios/level-5/regulatory-compliance.yaml +76 -0
  155. package/courses/mysql-query-optimization/course.yaml +11 -0
  156. package/courses/mysql-query-optimization/scenarios/level-1/buffer-pool-basics.yaml +65 -0
  157. package/courses/mysql-query-optimization/scenarios/level-1/explain-basics.yaml +66 -0
  158. package/courses/mysql-query-optimization/scenarios/level-1/first-optimization-shift.yaml +78 -0
  159. package/courses/mysql-query-optimization/scenarios/level-1/innodb-index-fundamentals.yaml +68 -0
  160. package/courses/mysql-query-optimization/scenarios/level-1/join-basics.yaml +66 -0
  161. package/courses/mysql-query-optimization/scenarios/level-1/n-plus-one-queries.yaml +67 -0
  162. package/courses/mysql-query-optimization/scenarios/level-1/query-rewriting-basics.yaml +66 -0
  163. package/courses/mysql-query-optimization/scenarios/level-1/select-star-problems.yaml +68 -0
  164. package/courses/mysql-query-optimization/scenarios/level-1/slow-query-diagnosis.yaml +65 -0
  165. package/courses/mysql-query-optimization/scenarios/level-1/where-clause-optimization.yaml +65 -0
  166. package/courses/mysql-query-optimization/scenarios/level-2/buffer-pool-tuning.yaml +64 -0
  167. package/courses/mysql-query-optimization/scenarios/level-2/composite-index-design.yaml +71 -0
  168. package/courses/mysql-query-optimization/scenarios/level-2/covering-and-invisible-indexes.yaml +69 -0
  169. package/courses/mysql-query-optimization/scenarios/level-2/cte-and-window-functions.yaml +78 -0
  170. package/courses/mysql-query-optimization/scenarios/level-2/intermediate-optimization-shift.yaml +68 -0
  171. package/courses/mysql-query-optimization/scenarios/level-2/join-optimization.yaml +67 -0
  172. package/courses/mysql-query-optimization/scenarios/level-2/performance-schema-analysis.yaml +69 -0
  173. package/courses/mysql-query-optimization/scenarios/level-2/query-optimizer-hints.yaml +74 -0
  174. package/courses/mysql-query-optimization/scenarios/level-2/subquery-optimization.yaml +70 -0
  175. package/courses/mysql-query-optimization/scenarios/level-2/write-optimization.yaml +63 -0
  176. package/courses/mysql-query-optimization/scenarios/level-3/advanced-optimization-shift.yaml +71 -0
  177. package/courses/mysql-query-optimization/scenarios/level-3/connection-management.yaml +67 -0
  178. package/courses/mysql-query-optimization/scenarios/level-3/full-text-search.yaml +77 -0
  179. package/courses/mysql-query-optimization/scenarios/level-3/json-optimization.yaml +87 -0
  180. package/courses/mysql-query-optimization/scenarios/level-3/lock-contention-analysis.yaml +68 -0
  181. package/courses/mysql-query-optimization/scenarios/level-3/monitoring-alerting.yaml +63 -0
  182. package/courses/mysql-query-optimization/scenarios/level-3/online-schema-changes.yaml +79 -0
  183. package/courses/mysql-query-optimization/scenarios/level-3/partitioning-strategies.yaml +83 -0
  184. package/courses/mysql-query-optimization/scenarios/level-3/query-profiling-deep-dive.yaml +84 -0
  185. package/courses/mysql-query-optimization/scenarios/level-3/replication-optimization.yaml +66 -0
  186. package/courses/mysql-query-optimization/scenarios/level-4/aurora-vs-rds-evaluation.yaml +61 -0
  187. package/courses/mysql-query-optimization/scenarios/level-4/data-architecture.yaml +62 -0
  188. package/courses/mysql-query-optimization/scenarios/level-4/database-migration-planning.yaml +59 -0
  189. package/courses/mysql-query-optimization/scenarios/level-4/enterprise-governance.yaml +50 -0
  190. package/courses/mysql-query-optimization/scenarios/level-4/executive-communication.yaml +54 -0
  191. package/courses/mysql-query-optimization/scenarios/level-4/expert-optimization-shift.yaml +67 -0
  192. package/courses/mysql-query-optimization/scenarios/level-4/high-availability-architecture.yaml +60 -0
  193. package/courses/mysql-query-optimization/scenarios/level-4/optimizer-internals.yaml +62 -0
  194. package/courses/mysql-query-optimization/scenarios/level-4/performance-sla-design.yaml +52 -0
  195. package/courses/mysql-query-optimization/scenarios/level-4/read-replica-scaling.yaml +51 -0
  196. package/courses/mysql-query-optimization/scenarios/level-5/ai-database-future.yaml +45 -0
  197. package/courses/mysql-query-optimization/scenarios/level-5/behavioral-science.yaml +44 -0
  198. package/courses/mysql-query-optimization/scenarios/level-5/benchmark-design.yaml +47 -0
  199. package/courses/mysql-query-optimization/scenarios/level-5/board-strategy.yaml +48 -0
  200. package/courses/mysql-query-optimization/scenarios/level-5/comprehensive-platform.yaml +49 -0
  201. package/courses/mysql-query-optimization/scenarios/level-5/consulting-engagement.yaml +52 -0
  202. package/courses/mysql-query-optimization/scenarios/level-5/ma-database-integration.yaml +47 -0
  203. package/courses/mysql-query-optimization/scenarios/level-5/master-optimization-shift.yaml +56 -0
  204. package/courses/mysql-query-optimization/scenarios/level-5/product-development.yaml +48 -0
  205. package/courses/mysql-query-optimization/scenarios/level-5/regulatory-compliance.yaml +48 -0
  206. package/courses/postgresql-query-optimization/scenarios/level-5/comprehensive-database-system.yaml +70 -0
  207. package/courses/postgresql-query-optimization/scenarios/level-5/database-ai-future.yaml +81 -0
  208. package/courses/postgresql-query-optimization/scenarios/level-5/database-behavioral-science.yaml +63 -0
  209. package/courses/postgresql-query-optimization/scenarios/level-5/database-board-strategy.yaml +77 -0
  210. package/courses/postgresql-query-optimization/scenarios/level-5/database-consulting-engagement.yaml +61 -0
  211. package/courses/postgresql-query-optimization/scenarios/level-5/database-industry-benchmarks.yaml +64 -0
  212. package/courses/postgresql-query-optimization/scenarios/level-5/database-ma-integration.yaml +71 -0
  213. package/courses/postgresql-query-optimization/scenarios/level-5/database-product-development.yaml +72 -0
  214. package/courses/postgresql-query-optimization/scenarios/level-5/database-regulatory-landscape.yaml +76 -0
  215. package/courses/postgresql-query-optimization/scenarios/level-5/master-optimization-shift.yaml +66 -0
  216. package/courses/terraform-infrastructure-setup/course.yaml +11 -0
  217. package/courses/terraform-infrastructure-setup/scenarios/level-1/hcl-syntax-errors.yaml +65 -0
  218. package/courses/terraform-infrastructure-setup/scenarios/level-1/provider-configuration.yaml +62 -0
  219. package/courses/terraform-infrastructure-setup/scenarios/level-1/terraform-init-errors.yaml +72 -0
  220. package/courses/terraform-infrastructure-setup/scenarios/level-1/variable-and-output-errors.yaml +78 -0
  221. package/dist/mcp/session-manager.d.ts +7 -4
  222. package/dist/mcp/session-manager.d.ts.map +1 -1
  223. package/dist/mcp/session-manager.js +23 -8
  224. package/dist/mcp/session-manager.js.map +1 -1
  225. package/package.json +3 -2
@@ -0,0 +1,66 @@
1
+ meta:
2
+ id: docker-compose-debugging
3
+ level: 2
4
+ course: docker-container-debugging
5
+ type: output
6
+ description: "Debug Docker Compose issues — diagnose service dependency failures, health check misconfigurations, and environment variable problems"
7
+ tags: [Docker, Docker-Compose, dependencies, health-checks, services, intermediate]
8
+
9
+ state: {}
10
+
11
+ trigger: |
12
+ Your Docker Compose application has 4 services but only 2 start
13
+ correctly:
14
+
15
+ $ docker compose up -d
16
+ $ docker compose ps
17
+ NAME SERVICE STATUS PORTS
18
+ api api Up (unhealthy) 0.0.0.0:8080->8080/tcp
19
+ db db Up (healthy) 5432/tcp
20
+ redis redis exited (1)
21
+ worker worker waiting
22
+
23
+ Problems:
24
+ 1. redis exited with code 1:
25
+ $ docker compose logs redis
26
+ Fatal: Could not read config file '/etc/redis/custom.conf': No such file
27
+
28
+ The compose file mounts a config file that doesn't exist:
29
+ volumes:
30
+ - ./redis.conf:/etc/redis/custom.conf
31
+
32
+ 2. worker is waiting because depends_on has condition: service_healthy
33
+ for redis, which exited (never became healthy).
34
+
35
+ 3. api shows "unhealthy" — the health check fails:
36
+ healthcheck:
37
+ test: ["CMD", "curl", "-f", "http://localhost:8080/health"]
38
+ But curl isn't installed in the API image. The health endpoint works
39
+ fine — the health CHECK command fails.
40
+
41
+ 4. Hidden issue: the API reads REDIS_URL from environment but the
42
+ compose file sets REDIS_HOST instead:
43
+ environment:
44
+ - REDIS_HOST=redis
45
+ - REDIS_PORT=6379
46
+
47
+ Task: Explain Docker Compose debugging. Write: how depends_on with
48
+ health checks works (condition: service_healthy vs service_started),
49
+ how to debug health check failures, environment variable patterns in
50
+ Compose (environment, env_file, variable substitution), common
51
+ Compose configuration mistakes, and the docker compose debugging
52
+ commands (logs, ps, config, exec).
53
+
54
+ assertions:
55
+ - type: llm_judge
56
+ criteria: "Service dependencies are explained — depends_on with condition: service_started only waits for container to start (not ready), condition: service_healthy waits for health check to pass. If a dependency exits or stays unhealthy, dependent services won't start. Health checks need: test command, interval, timeout, retries, start_period. The test command must work inside the container (tools must be installed)"
57
+ weight: 0.35
58
+ description: "Service dependencies"
59
+ - type: llm_judge
60
+ criteria: "Debugging workflow is practical — docker compose config validates and shows the resolved YAML (catches syntax errors, shows interpolated variables), docker compose logs <service> shows service logs, docker compose ps shows health status, docker compose exec <service> sh for interactive debugging, docker compose up --build to rebuild images, docker compose down -v for clean restart"
61
+ weight: 0.35
62
+ description: "Debugging workflow"
63
+ - type: llm_judge
64
+ criteria: "Environment and common mistakes are covered — Compose environment sources: environment key (inline), env_file (.env file reference), shell variables with ${VAR} substitution, .env file auto-loaded for Compose variables. Common mistakes: wrong env var name, missing env file, volume mount source doesn't exist (Docker creates directory), health check command not available in image, circular dependencies"
65
+ weight: 0.30
66
+ description: "Environment and mistakes"
@@ -0,0 +1,71 @@
1
+ meta:
2
+ id: docker-exec-debugging
3
+ level: 2
4
+ course: docker-container-debugging
5
+ type: output
6
+ description: "Debug running containers with docker exec — diagnose runtime issues using interactive shells, process inspection, and filesystem exploration inside containers"
7
+ tags: [Docker, exec, debugging, interactive, process-inspection, intermediate]
8
+
9
+ state: {}
10
+
11
+ trigger: |
12
+ Your API container is responding slowly but docker logs shows nothing
13
+ unusual. You need to investigate the running container from the inside:
14
+
15
+ $ docker exec -it api-server sh
16
+ OCI runtime exec failed: exec: "sh": executable file not found
17
+
18
+ The image is based on distroless — no shell at all! You can't exec
19
+ into it. But there are alternatives:
20
+
21
+ Solution 1 — Use debug image variant:
22
+ $ docker run --rm -it --pid=container:api-server --net=container:api-server \
23
+ busybox sh
24
+ # Shares PID and network namespace — can see processes and connections
25
+
26
+ Solution 2 — Docker debug (Docker Desktop 4.27+):
27
+ $ docker debug api-server
28
+ # Attaches a debug shell even to distroless containers
29
+
30
+ Once inside a container with a shell, the investigation:
31
+
32
+ $ docker exec api-server ps aux
33
+ PID USER TIME COMMAND
34
+ 1 node 2:30 node /app/server.js
35
+ 45 node 0:05 /app/node_modules/.bin/sharp (zombie)
36
+ 46 node 0:05 /app/node_modules/.bin/sharp (zombie)
37
+
38
+ Zombie processes! The Node.js app spawns child processes for image
39
+ processing but doesn't properly wait() for them. PID 1 (node) isn't
40
+ a proper init and doesn't reap orphaned children.
41
+
42
+ $ docker exec api-server cat /proc/1/status | grep Threads
43
+ Threads: 45
44
+
45
+ 45 threads — the thread pool is exhausted because zombie processes
46
+ still hold thread pool slots.
47
+
48
+ $ docker exec api-server cat /proc/meminfo
49
+ $ docker exec api-server df -h
50
+ $ docker exec api-server netstat -tlnp
51
+
52
+ Task: Explain docker exec debugging techniques. Write: how to exec
53
+ into containers (interactive shell, single commands), debugging
54
+ distroless/minimal images (namespace sharing, debug containers),
55
+ process inspection (ps, /proc filesystem, zombie detection), resource
56
+ inspection (memory, disk, network from inside), and the PID 1 zombie
57
+ reaping problem.
58
+
59
+ assertions:
60
+ - type: llm_judge
61
+ criteria: "Docker exec techniques are explained — docker exec -it <container> sh/bash for interactive shell, docker exec <container> <command> for single command. Flags: -it (interactive + tty), -u root (run as root even if container runs as non-root), -e KEY=VALUE (set env vars). For distroless images: share namespaces with debug container (--pid=container:X --net=container:X), use docker debug (Docker Desktop), or docker cp to copy tools in. Never install debug tools in production images"
62
+ weight: 0.35
63
+ description: "Exec techniques"
64
+ - type: llm_judge
65
+ criteria: "Process and resource inspection are covered — ps aux shows all processes. /proc filesystem: /proc/1/status (PID 1 details), /proc/meminfo (memory), /proc/net/tcp (connections). Zombie processes: Z state in ps, caused by parent not calling wait(). PID 1 responsibility: in containers, PID 1 must reap adopted orphan processes. Node.js/Python aren't proper init systems. Fix: use tini (--init flag) or dumb-init as PID 1. Resource inspection: df -h (disk), free -m (memory), ss -tlnp (listening ports)"
66
+ weight: 0.35
67
+ description: "Process inspection"
68
+ - type: llm_judge
69
+ criteria: "Practical debugging workflow is provided — systematic approach: (1) docker logs first (no exec needed), (2) docker stats for resource overview, (3) docker top for process list, (4) docker exec for detailed investigation. Inside container: check processes, check disk space, check network connections, check file modifications. Compare with expected state. Common findings: zombie processes, thread pool exhaustion, file descriptor leaks (ls /proc/1/fd | wc -l), temp files filling disk, unexpected network connections"
70
+ weight: 0.30
71
+ description: "Debugging workflow"
@@ -0,0 +1,81 @@
1
+ meta:
2
+ id: image-layer-optimization
3
+ level: 2
4
+ course: docker-container-debugging
5
+ type: output
6
+ description: "Debug Docker image size issues — analyze layers, optimize caching, reduce image size, and fix build cache invalidation"
7
+ tags: [Docker, image-optimization, layers, caching, size-reduction, intermediate]
8
+
9
+ state: {}
10
+
11
+ trigger: |
12
+ Your Docker image is 1.2GB for a simple Node.js application. The
13
+ application code is only 5MB. Where did the rest come from?
14
+
15
+ $ docker images myapp
16
+ REPOSITORY TAG SIZE
17
+ myapp latest 1.2GB
18
+
19
+ $ docker history myapp
20
+ IMAGE CREATED BY SIZE
21
+ abc123 CMD ["node", "server.js"] 0B
22
+ def456 COPY . /app 850MB
23
+ ghi789 RUN npm install 280MB
24
+ jkl012 COPY package.json /app/ 2KB
25
+ mno345 WORKDIR /app 0B
26
+ pqr678 FROM node:20 1.1GB (base)
27
+
28
+ Wait, the base image is 1.1GB, but the total is 1.2GB? Docker layers
29
+ are additive but share the base. The real issues:
30
+
31
+ 1. COPY . /app is 850MB — it copied node_modules, .git directory,
32
+ build artifacts, and test data! No .dockerignore file exists.
33
+
34
+ 2. npm install adds 280MB but many are devDependencies not needed
35
+ in production.
36
+
37
+ 3. The base image node:20 (Debian-based) is huge. node:20-alpine
38
+ would be ~180MB.
39
+
40
+ After creating .dockerignore:
41
+ node_modules
42
+ .git
43
+ *.log
44
+ test/
45
+ .env
46
+
47
+ And optimizing the Dockerfile:
48
+ FROM node:20-alpine
49
+ WORKDIR /app
50
+ COPY package*.json ./
51
+ RUN npm ci --only=production
52
+ COPY . .
53
+ CMD ["node", "server.js"]
54
+
55
+ New size: 180MB (from 1.2GB — 85% reduction!)
56
+
57
+ But builds are slow because changing ANY source file invalidates the
58
+ npm install cache. The COPY package*.json first + RUN npm install
59
+ pattern preserves the cache when only source code changes.
60
+
61
+ Task: Explain Docker image optimization. Write: how layers work
62
+ (each instruction creates a layer, layers are cached and shared),
63
+ how build cache invalidation works (any change to a layer invalidates
64
+ all subsequent layers), .dockerignore best practices, the dependency-
65
+ first pattern for caching, base image selection (full vs slim vs
66
+ alpine vs distroless), and how to analyze image size with docker
67
+ history and dive.
68
+
69
+ assertions:
70
+ - type: llm_judge
71
+ criteria: "Layer mechanics are explained — each RUN, COPY, ADD creates a new layer. Layers are cached by content hash. If a layer's content changes, that layer and ALL subsequent layers are rebuilt. This is why instruction order matters: put stable instructions first (dependencies) and frequently changing ones last (source code). Layers are shared between images with common base"
72
+ weight: 0.35
73
+ description: "Layer mechanics"
74
+ - type: llm_judge
75
+ criteria: "Cache optimization is covered — dependency-first pattern: COPY package.json first, RUN npm install, then COPY source code. This way npm install is only re-run when dependencies change, not when source code changes. .dockerignore excludes files from build context (like .gitignore), preventing unnecessary cache busting and reducing context size. Use npm ci instead of npm install for reproducible builds"
76
+ weight: 0.35
77
+ description: "Cache optimization"
78
+ - type: llm_judge
79
+ criteria: "Size reduction techniques are practical — use slim/alpine base images (1.1GB → 180MB), multi-stage builds for compiled languages, .dockerignore to exclude unnecessary files, clean package manager cache in same RUN (apt-get clean && rm -rf /var/lib/apt/lists/*), use --only=production for Node.js, analyze with docker history or dive tool. Combine RUN commands to reduce layers"
80
+ weight: 0.30
81
+ description: "Size reduction"
@@ -0,0 +1,73 @@
1
+ meta:
2
+ id: intermediate-debugging-shift
3
+ level: 2
4
+ course: docker-container-debugging
5
+ type: output
6
+ description: "Combined intermediate debugging shift — diagnose multi-service Docker Compose application with build, networking, health check, and logging issues"
7
+ tags: [Docker, troubleshooting, combined, shift-simulation, intermediate]
8
+
9
+ state: {}
10
+
11
+ trigger: |
12
+ You're debugging a Docker Compose application that a colleague set up.
13
+ It has 5 services and "nothing works":
14
+
15
+ $ docker compose up -d
16
+ $ docker compose ps
17
+ NAME SERVICE STATUS PORTS
18
+ frontend frontend Up (unhealthy) 0.0.0.0:3000->3000/tcp
19
+ api api exited (1)
20
+ worker worker waiting
21
+ postgres postgres Up (healthy) 5432/tcp
22
+ redis redis Up 2 seconds 6379/tcp
23
+
24
+ Investigation reveals 5 interconnected issues:
25
+
26
+ 1. api — Build failed silently, running old cached image:
27
+ $ docker compose logs api
28
+ Error: Cannot find module '/app/dist/server.js'
29
+ The Dockerfile has a multi-stage build but COPY --from uses wrong
30
+ stage name. The old image (without the build fix) was cached.
31
+ Fix: docker compose build --no-cache api
32
+
33
+ 2. worker — depends_on api with condition: service_healthy, but api
34
+ exited so worker waits forever.
35
+
36
+ 3. frontend — Marked unhealthy. Health check uses curl but the
37
+ alpine-based image doesn't have curl.
38
+
39
+ 4. redis — Running but no persistence configured. Every restart
40
+ loses session data. Also, no log rotation — redis logs growing fast.
41
+
42
+ 5. Hidden issue — postgres password is set in docker-compose.yaml
43
+ as an environment variable visible in docker inspect. Should use
44
+ Docker secrets or env_file with restricted permissions.
45
+
46
+ $ docker system df
47
+ TYPE TOTAL ACTIVE SIZE RECLAIMABLE
48
+ Images 45 5 12.5GB 10.2GB (81%)
49
+ Containers 12 5 500MB 200MB
50
+ Volumes 23 3 8.5GB 6.2GB (72%)
51
+
52
+ Additionally, 81% of images and 72% of volumes are reclaimable
53
+ (unused). Disk space is filling up.
54
+
55
+ Task: Walk through diagnosing and fixing all issues. Write: the
56
+ triage approach for multi-service Compose applications, the fix for
57
+ each issue, how to clean up unused Docker resources (docker system
58
+ prune), security best practices for secrets in Compose, and the
59
+ maintenance checklist for Docker environments.
60
+
61
+ assertions:
62
+ - type: llm_judge
63
+ criteria: "All five issues are diagnosed and fixed — (1) stale cached image: docker compose build --no-cache, fix COPY --from stage name, (2) worker waiting: fix api first, worker will start automatically, (3) frontend health check: use wget instead of curl or install curl in Dockerfile, (4) redis: add volume for persistence, configure log rotation, (5) secrets: use env_file with chmod 600 or Docker secrets, never plain environment variables for passwords"
64
+ weight: 0.35
65
+ description: "All issues fixed"
66
+ - type: llm_judge
67
+ criteria: "Cleanup and maintenance are covered — docker system df shows disk usage breakdown, docker system prune removes unused containers/images/networks, docker volume prune removes unused volumes (careful!), docker builder prune clears build cache. Maintenance checklist: regular prune, log rotation configured globally, base image updates, security scanning, volume backup strategy"
68
+ weight: 0.35
69
+ description: "Cleanup and maintenance"
70
+ - type: llm_judge
71
+ criteria: "Triage methodology is systematic — check docker compose ps first (status overview), check logs for exited services, check health for unhealthy services, fix dependencies bottom-up (database → api → worker → frontend), verify networking between services, check for resource issues (disk, memory). Security audit: check for secrets in environment, image vulnerabilities, privileged containers"
72
+ weight: 0.30
73
+ description: "Triage methodology"
@@ -0,0 +1,76 @@
1
+ meta:
2
+ id: logging-and-log-rotation
3
+ level: 2
4
+ course: docker-container-debugging
5
+ type: output
6
+ description: "Debug Docker logging issues — diagnose disk exhaustion from logs, configure log rotation, and set up logging drivers"
7
+ tags: [Docker, logging, log-rotation, json-file, disk-space, intermediate]
8
+
9
+ state: {}
10
+
11
+ trigger: |
12
+ Your Docker host is running out of disk space. Investigation reveals
13
+ container logs are the culprit:
14
+
15
+ $ df -h /var/lib/docker
16
+ Filesystem Size Used Avail Use%
17
+ /dev/sda1 100G 95G 5G 95%
18
+
19
+ $ du -sh /var/lib/docker/containers/*/
20
+ 45G /var/lib/docker/containers/a1b2c3d4.../
21
+ 30G /var/lib/docker/containers/b2c3d4e5.../
22
+ 15G /var/lib/docker/containers/c3d4e5f6.../
23
+
24
+ 90GB of logs! The containers have been running for months with no
25
+ log rotation configured.
26
+
27
+ $ ls -lh /var/lib/docker/containers/a1b2c3d4.../*-json.log
28
+ -rw-r----- 1 root root 45G Dec 01 10:00 a1b2c3d4...-json.log
29
+
30
+ A single 45GB log file! The default json-file logging driver has
31
+ NO rotation by default.
32
+
33
+ Emergency fix:
34
+ $ truncate -s 0 /var/lib/docker/containers/a1b2c3d4.../*-json.log
35
+
36
+ Proper fix — configure log rotation per container:
37
+ docker run --log-opt max-size=10m --log-opt max-file=3 myapp
38
+
39
+ Or globally in /etc/docker/daemon.json:
40
+ {
41
+ "log-driver": "json-file",
42
+ "log-opts": {
43
+ "max-size": "10m",
44
+ "max-file": "3"
45
+ }
46
+ }
47
+
48
+ But there's a caveat: changing daemon.json only affects NEW containers.
49
+ Existing containers keep their original logging configuration.
50
+
51
+ Additional issue: one service uses the fluentd logging driver:
52
+ $ docker logs fluentd-service
53
+ Error response from daemon: configured logging driver does not
54
+ support reading
55
+
56
+ Some logging drivers don't support docker logs command!
57
+
58
+ Task: Explain Docker logging and log management. Write: the default
59
+ json-file driver behavior (no rotation!), how to configure log
60
+ rotation (max-size, max-file), logging drivers (json-file, syslog,
61
+ fluentd, journald), which drivers support docker logs, daemon.json
62
+ global configuration, and production logging strategies.
63
+
64
+ assertions:
65
+ - type: llm_judge
66
+ criteria: "Default logging behavior is explained — json-file driver stores logs as JSON in /var/lib/docker/containers/<id>/<id>-json.log. NO rotation by default — logs grow indefinitely and can fill disk. This is the single most common Docker disk space issue. Logs capture stdout and stderr from the container's PID 1 process. Applications logging to files inside the container are NOT captured by docker logs"
67
+ weight: 0.35
68
+ description: "Default behavior"
69
+ - type: llm_judge
70
+ criteria: "Log rotation configuration is covered — per-container: --log-opt max-size=10m --log-opt max-file=3 (keeps 3 files of 10MB = 30MB max). Global via daemon.json (only affects new containers). Logging drivers: json-file (local, supports docker logs), syslog (remote syslog server), fluentd (log aggregation), journald (systemd). Not all drivers support docker logs — fluentd and syslog don't by default"
71
+ weight: 0.35
72
+ description: "Log rotation"
73
+ - type: llm_judge
74
+ criteria: "Production strategy is practical — development: json-file with rotation. Production: centralized logging (fluentd → Elasticsearch, or CloudWatch/Datadog). Use dual logging (Docker 20.10+) to keep docker logs working while forwarding to centralized system. Monitor /var/lib/docker disk usage. Set global log rotation in daemon.json as a safety net. Use docker system df to check disk usage breakdown"
75
+ weight: 0.30
76
+ description: "Production strategy"
@@ -0,0 +1,76 @@
1
+ meta:
2
+ id: multi-stage-build-debugging
3
+ level: 2
4
+ course: docker-container-debugging
5
+ type: output
6
+ description: "Debug multi-stage Docker builds — diagnose missing artifacts, stage naming issues, and layer optimization problems"
7
+ tags: [Docker, multi-stage, build, optimization, layers, intermediate]
8
+
9
+ state: {}
10
+
11
+ trigger: |
12
+ Your multi-stage build produces an image but the application binary
13
+ is missing at runtime:
14
+
15
+ Dockerfile:
16
+ FROM golang:1.22 AS builder
17
+ WORKDIR /src
18
+ COPY go.mod go.sum ./
19
+ RUN go mod download
20
+ COPY . .
21
+ RUN CGO_ENABLED=0 go build -o /app/server ./cmd/server
22
+
23
+ FROM alpine:3.19
24
+ WORKDIR /app
25
+ COPY --from=build /app/server .
26
+ CMD ["./server"]
27
+
28
+ $ docker build -t myapp .
29
+ Step 8/9: COPY --from=build /app/server .
30
+ ERROR: invalid from flag value build: not found
31
+
32
+ The COPY uses --from=build but the stage is named "builder"!
33
+ After fixing to --from=builder:
34
+
35
+ $ docker build -t myapp .
36
+ Successfully built abc123def456
37
+
38
+ $ docker run myapp
39
+ sh: ./server: not found
40
+
41
+ The binary exists but won't run! On alpine, the binary was compiled
42
+ with CGO_ENABLED=0 (static linking), which should work. But wait —
43
+ the binary was built for linux/amd64 and you're on an Apple Silicon
44
+ Mac (linux/arm64).
45
+
46
+ Fix: Add GOARCH=arm64 or use --platform:
47
+ RUN GOOS=linux GOARCH=$(go env GOARCH) CGO_ENABLED=0 go build ...
48
+
49
+ After fixing, the image works but is 150MB. The Go binary is only
50
+ 8MB. Why is the image so big?
51
+
52
+ $ docker history myapp
53
+ Alpine base: 7MB, binary: 8MB, go module cache: 135MB
54
+
55
+ The go module cache was accidentally copied! The COPY . . in the
56
+ builder stage included the vendor directory.
57
+
58
+ Task: Explain multi-stage build debugging. Write: how multi-stage
59
+ builds work (multiple FROM, COPY --from), common stage naming issues,
60
+ how to inspect intermediate stages (--target), artifact path debugging,
61
+ cross-compilation issues, image size optimization, and when to use
62
+ distroless vs alpine vs scratch.
63
+
64
+ assertions:
65
+ - type: llm_judge
66
+ criteria: "Multi-stage mechanics are explained — each FROM starts a new stage, stages can be named with AS keyword, COPY --from=<stage> copies files from a previous stage. Only the final stage becomes the image. Intermediate stages are discarded. Use --target to build up to a specific stage for debugging. Stage names are case-sensitive and must match exactly"
67
+ weight: 0.35
68
+ description: "Multi-stage mechanics"
69
+ - type: llm_judge
70
+ criteria: "Common issues are diagnosed — stage name mismatch in COPY --from (most common error), binary not found at runtime (wrong platform, dynamic linking on static-only base), accidentally copying build artifacts (caches, source code) into final stage, missing runtime dependencies (libc on scratch/distroless). Use docker history to see layer sizes and find bloat"
71
+ weight: 0.35
72
+ description: "Common issues"
73
+ - type: llm_judge
74
+ criteria: "Base image selection is compared — scratch: 0MB, no shell, no libc (only for fully static binaries), alpine: ~7MB, has shell and musl libc (good for debugging), distroless: 10-50MB, no shell (secure, minimal attack surface). For Go: scratch or distroless. For Node/Python: language-specific slim/distroless. Trade-off: smaller = more secure but harder to debug"
75
+ weight: 0.30
76
+ description: "Base image selection"
@@ -0,0 +1,67 @@
1
+ meta:
2
+ id: network-debugging-tools
3
+ level: 2
4
+ course: docker-container-debugging
5
+ type: output
6
+ description: "Debug Docker networking with tools — use tcpdump, curl, netcat, and nslookup inside containers to diagnose connectivity issues"
7
+ tags: [Docker, networking, tcpdump, debugging-tools, connectivity, intermediate]
8
+
9
+ state: {}
10
+
11
+ trigger: |
12
+ Your containerized API intermittently fails to connect to an external
13
+ payment gateway. The error is "connection timed out" but only for
14
+ some requests. You need to capture network traffic to understand why.
15
+
16
+ Problem: your container uses a minimal image with no debugging tools:
17
+
18
+ $ docker exec api-server curl http://payment-api:8443/health
19
+ OCI runtime exec failed: exec: "curl": executable file not found
20
+
21
+ $ docker exec api-server ping payment-api
22
+ OCI runtime exec failed: exec: "ping": executable file not found
23
+
24
+ Solution 1 — Use a sidecar debug container on the same network:
25
+ $ docker run --rm -it --network container:api-server nicolaka/netshoot
26
+
27
+ Now you have all networking tools sharing the api-server's network
28
+ namespace:
29
+
30
+ $ nslookup payment-api
31
+ Name: payment-api
32
+ Address: 172.18.0.5
33
+
34
+ $ curl -v http://payment-api:8443/health
35
+ * Connected to payment-api (172.18.0.5) port 8443
36
+
37
+ $ tcpdump -i eth0 host 172.18.0.5 -w /tmp/capture.pcap
38
+ (capture packets for analysis)
39
+
40
+ $ nc -zv payment-api 8443
41
+ Connection to payment-api 8443 port [tcp/https-alt] succeeded!
42
+
43
+ The tcpdump capture reveals: some DNS responses take 5+ seconds
44
+ because the container's /etc/resolv.conf has ndots:5, causing
45
+ multiple DNS lookups for external hostnames before trying the
46
+ actual hostname.
47
+
48
+ Task: Explain Docker network debugging with tools. Write: how to
49
+ use debugging containers (netshoot) with --network container: mode,
50
+ key tools (curl, tcpdump, nslookup, dig, netcat, ss, traceroute),
51
+ how to capture and analyze packets, common DNS issues in containers
52
+ (ndots, search domains), and debugging external connectivity from
53
+ containers.
54
+
55
+ assertions:
56
+ - type: llm_judge
57
+ criteria: "Debug container approach is explained — use --network container:<target> to share the target container's network namespace. The debug container sees the same IPs, routes, DNS config. nicolaka/netshoot is the standard toolbox image. Alternative: install tools temporarily with docker exec (if package manager available). Never install debug tools in production images"
58
+ weight: 0.35
59
+ description: "Debug container approach"
60
+ - type: llm_judge
61
+ criteria: "Key tools and usage are covered — nslookup/dig for DNS resolution testing, curl -v for HTTP debugging (shows connection, TLS, headers), tcpdump for packet capture (filter by host, port, protocol), netcat (nc -zv) for port connectivity testing, ss -tlnp for listing listening ports, traceroute for routing path. Each tool answers a different question in the debugging process"
62
+ weight: 0.35
63
+ description: "Tools and usage"
64
+ - type: llm_judge
65
+ criteria: "DNS issues are explained — ndots:5 in container resolv.conf means names with < 5 dots get search domains appended first (app.payment.com → app.payment.com.default.svc.cluster.local first). This causes slow DNS for external hostnames. Fix: use FQDN with trailing dot (payment-api.external.com.) or adjust ndots. Also: DNS caching, TTL, and how Docker's embedded DNS (127.0.0.11) works on custom networks"
66
+ weight: 0.30
67
+ description: "DNS issues"
@@ -0,0 +1,71 @@
1
+ meta:
2
+ id: pid1-signal-handling
3
+ level: 2
4
+ course: docker-container-debugging
5
+ type: output
6
+ description: "Debug PID 1 and signal handling issues — diagnose containers that won't stop gracefully, zombie processes, and init system problems"
7
+ tags: [Docker, PID-1, signals, tini, graceful-shutdown, zombie-processes, intermediate]
8
+
9
+ state: {}
10
+
11
+ trigger: |
12
+ Your container takes exactly 10 seconds to stop every time:
13
+
14
+ $ time docker stop api-server
15
+ api-server
16
+ real 0m10.032s
17
+
18
+ Docker stop sends SIGTERM, waits 10 seconds (default grace period),
19
+ then sends SIGKILL. Your container is ignoring SIGTERM!
20
+
21
+ $ docker exec api-server ps aux
22
+ PID USER COMMAND
23
+ 1 root /bin/sh -c node server.js
24
+ 7 root node server.js
25
+
26
+ PID 1 is /bin/sh, not your application! The shell is PID 1, and
27
+ shells as PID 1 don't forward signals to child processes. Node.js
28
+ (PID 7) never receives SIGTERM.
29
+
30
+ This happens because the Dockerfile uses shell form:
31
+ CMD node server.js
32
+ (interpreted as: /bin/sh -c "node server.js")
33
+
34
+ vs exec form:
35
+ CMD ["node", "server.js"]
36
+ (node becomes PID 1 directly)
37
+
38
+ But even with exec form, there's another problem — PID 1 processes
39
+ don't have default signal handlers in Linux. Unless your app
40
+ explicitly handles SIGTERM, it gets ignored.
41
+
42
+ Additionally, after running for a while:
43
+ $ docker exec api-server ps aux | grep defunct
44
+ 15 root [worker] <defunct>
45
+ 23 root [worker] <defunct>
46
+
47
+ Zombie processes! PID 1 is supposed to reap orphaned child processes,
48
+ but your app doesn't do that.
49
+
50
+ Solution: Use an init system (tini or --init flag):
51
+ $ docker run --init api-server
52
+
53
+ Task: Explain the PID 1 problem in Docker. Write: why PID 1 is
54
+ special (signal handling, zombie reaping), shell form vs exec form
55
+ CMD/ENTRYPOINT, what happens during docker stop (SIGTERM → wait →
56
+ SIGKILL), how to use tini/dumb-init as an init process, the --init
57
+ flag, and how to implement graceful shutdown in applications.
58
+
59
+ assertions:
60
+ - type: llm_judge
61
+ criteria: "PID 1 problem is explained — PID 1 in Linux has special behavior: it doesn't have default signal handlers (SIGTERM is ignored unless explicitly handled), and it's responsible for reaping zombie child processes (wait() on orphaned children). If your app is PID 1 and doesn't handle these, it won't shut down gracefully and zombies accumulate"
62
+ weight: 0.35
63
+ description: "PID 1 problem"
64
+ - type: llm_judge
65
+ criteria: "Shell vs exec form is explained — shell form (CMD node server.js) wraps in /bin/sh -c, making shell PID 1 and app a child process. Shell doesn't forward signals. Exec form (CMD ['node', 'server.js']) makes app PID 1 directly, receiving signals. ENTRYPOINT has the same distinction. docker stop sends SIGTERM to PID 1, waits --stop-timeout (default 10s), then SIGKILL"
66
+ weight: 0.35
67
+ description: "Shell vs exec form"
68
+ - type: llm_judge
69
+ criteria: "Solutions are practical — tini: lightweight init process (10KB), handles signal forwarding and zombie reaping. Install in Dockerfile: RUN apk add tini, ENTRYPOINT ['tini', '--'], CMD ['node', 'server.js']. Or use --init flag at runtime: docker run --init myapp. For application-level handling: implement SIGTERM handler (close connections, flush logs, exit cleanly). dumb-init is an alternative to tini"
70
+ weight: 0.30
71
+ description: "Solutions"
@@ -0,0 +1,67 @@
1
+ meta:
2
+ id: security-scanning-basics
3
+ level: 2
4
+ course: docker-container-debugging
5
+ type: output
6
+ description: "Debug container security issues — scan images for vulnerabilities, understand CVE severity, and fix common security problems"
7
+ tags: [Docker, security, scanning, Trivy, CVE, vulnerability, intermediate]
8
+
9
+ state: {}
10
+
11
+ trigger: |
12
+ Your CI/CD pipeline started failing after adding a security scan step:
13
+
14
+ $ trivy image myapp:latest
15
+ Total: 147 (CRITICAL: 3, HIGH: 12, MEDIUM: 45, LOW: 87)
16
+
17
+ CRITICAL vulnerabilities:
18
+ ┌─────────────────┬──────────────┬──────────┬─────────────────────────┐
19
+ │ Library │ Vulnerability│ Severity │ Fixed Version │
20
+ ├─────────────────┼──────────────┼──────────┼─────────────────────────┤
21
+ │ openssl │ CVE-2024-XXX │ CRITICAL │ 3.0.13 │
22
+ │ curl │ CVE-2024-YYY │ CRITICAL │ 8.6.0 │
23
+ │ node │ CVE-2024-ZZZ │ CRITICAL │ 20.11.1 │
24
+ └─────────────────┴──────────────┴──────────┴─────────────────────────┘
25
+
26
+ Questions:
27
+ 1. All 3 critical CVEs are in the base image (node:20.10.0), not in
28
+ your application code. Updating the base image to node:20.11.1
29
+ fixes all three.
30
+
31
+ 2. Of the 12 HIGH vulnerabilities, 8 are in packages your app doesn't
32
+ even use — they're just in the base image.
33
+
34
+ 3. After updating the base image, re-scanning still shows 45 MEDIUM
35
+ and 87 LOW vulnerabilities. Should you block deployment?
36
+
37
+ 4. Your company's policy: block on CRITICAL and HIGH, allow MEDIUM
38
+ and below. But one HIGH CVE has no fix available yet.
39
+
40
+ $ trivy image --severity CRITICAL,HIGH myapp:latest
41
+ Total: 1 (HIGH: 1) # After base image update
42
+
43
+ The unfixable HIGH CVE is in a transitive dependency. Options:
44
+ - Accept the risk and add to ignore list
45
+ - Switch to a different library
46
+ - Wait for upstream fix
47
+
48
+ Task: Explain container security scanning. Write: how vulnerability
49
+ scanners work (match packages against CVE databases), scanner tools
50
+ (Trivy, Docker Scout, Snyk), severity levels and what they mean,
51
+ how to reduce vulnerabilities (base image selection, minimal images),
52
+ handling unfixable vulnerabilities, and integrating scanning into
53
+ CI/CD pipelines.
54
+
55
+ assertions:
56
+ - type: llm_judge
57
+ criteria: "Scanning mechanics are explained — scanners extract the package list from image layers (OS packages + language dependencies), then match against CVE databases (NVD, vendor advisories). Each CVE has a severity (CRITICAL/HIGH/MEDIUM/LOW) based on CVSS score. Most vulnerabilities come from the base image, not application code. Updating the base image is the most impactful fix"
58
+ weight: 0.35
59
+ description: "Scanning mechanics"
60
+ - type: llm_judge
61
+ criteria: "Reduction strategies are covered — use minimal base images (alpine, distroless, slim) to reduce attack surface, regularly update base images, use multi-stage builds to exclude build tools from final image, remove unnecessary packages. Scanner comparison: Trivy (free, fast, broad), Docker Scout (native Docker integration), Snyk (developer-focused, fix suggestions)"
62
+ weight: 0.35
63
+ description: "Reduction strategies"
64
+ - type: llm_judge
65
+ criteria: "CI/CD integration and policy are practical — fail builds on CRITICAL: trivy image --exit-code 1 --severity CRITICAL myapp. Allow ignore list for accepted risks (.trivyignore file). Use --ignore-unfixed to skip CVEs without available patches. Policy: define severity threshold per environment (block CRITICAL in prod, warn in dev). Scan on every build, schedule weekly full scans for drift detection"
66
+ weight: 0.30
67
+ description: "CI/CD integration"