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.
- package/courses/GENERATION_LOG.md +45 -0
- package/courses/aws-lambda-debugging/course.yaml +11 -0
- package/courses/aws-lambda-debugging/scenarios/level-1/api-gateway-integration.yaml +71 -0
- package/courses/aws-lambda-debugging/scenarios/level-1/cloudwatch-logs-basics.yaml +64 -0
- package/courses/aws-lambda-debugging/scenarios/level-1/cold-start-basics.yaml +70 -0
- package/courses/aws-lambda-debugging/scenarios/level-1/environment-variable-issues.yaml +72 -0
- package/courses/aws-lambda-debugging/scenarios/level-1/first-debugging-shift.yaml +73 -0
- package/courses/aws-lambda-debugging/scenarios/level-1/handler-import-errors.yaml +71 -0
- package/courses/aws-lambda-debugging/scenarios/level-1/iam-permission-errors.yaml +68 -0
- package/courses/aws-lambda-debugging/scenarios/level-1/invocation-errors.yaml +72 -0
- package/courses/aws-lambda-debugging/scenarios/level-1/lambda-timeout-errors.yaml +65 -0
- package/courses/aws-lambda-debugging/scenarios/level-1/memory-and-oom.yaml +70 -0
- package/courses/aws-lambda-debugging/scenarios/level-2/async-invocation-failures.yaml +72 -0
- package/courses/aws-lambda-debugging/scenarios/level-2/cold-start-optimization.yaml +76 -0
- package/courses/aws-lambda-debugging/scenarios/level-2/dynamodb-streams-debugging.yaml +70 -0
- package/courses/aws-lambda-debugging/scenarios/level-2/intermediate-debugging-shift.yaml +71 -0
- package/courses/aws-lambda-debugging/scenarios/level-2/lambda-concurrency-management.yaml +70 -0
- package/courses/aws-lambda-debugging/scenarios/level-2/lambda-layers-debugging.yaml +76 -0
- package/courses/aws-lambda-debugging/scenarios/level-2/sam-local-debugging.yaml +74 -0
- package/courses/aws-lambda-debugging/scenarios/level-2/sqs-event-source.yaml +72 -0
- package/courses/aws-lambda-debugging/scenarios/level-2/vpc-networking-issues.yaml +71 -0
- package/courses/aws-lambda-debugging/scenarios/level-2/xray-tracing.yaml +62 -0
- package/courses/aws-lambda-debugging/scenarios/level-3/advanced-debugging-shift.yaml +72 -0
- package/courses/aws-lambda-debugging/scenarios/level-3/container-image-lambda.yaml +79 -0
- package/courses/aws-lambda-debugging/scenarios/level-3/cross-account-invocation.yaml +72 -0
- package/courses/aws-lambda-debugging/scenarios/level-3/eventbridge-patterns.yaml +79 -0
- package/courses/aws-lambda-debugging/scenarios/level-3/iac-deployment-debugging.yaml +68 -0
- package/courses/aws-lambda-debugging/scenarios/level-3/kinesis-stream-processing.yaml +64 -0
- package/courses/aws-lambda-debugging/scenarios/level-3/lambda-at-edge.yaml +64 -0
- package/courses/aws-lambda-debugging/scenarios/level-3/lambda-extensions-debugging.yaml +67 -0
- package/courses/aws-lambda-debugging/scenarios/level-3/powertools-observability.yaml +79 -0
- package/courses/aws-lambda-debugging/scenarios/level-3/step-functions-debugging.yaml +80 -0
- package/courses/aws-lambda-debugging/scenarios/level-4/cost-optimization-strategy.yaml +67 -0
- package/courses/aws-lambda-debugging/scenarios/level-4/expert-debugging-shift.yaml +62 -0
- package/courses/aws-lambda-debugging/scenarios/level-4/incident-management-serverless.yaml +61 -0
- package/courses/aws-lambda-debugging/scenarios/level-4/multi-region-serverless.yaml +67 -0
- package/courses/aws-lambda-debugging/scenarios/level-4/observability-platform-design.yaml +71 -0
- package/courses/aws-lambda-debugging/scenarios/level-4/serverless-architecture-design.yaml +64 -0
- package/courses/aws-lambda-debugging/scenarios/level-4/serverless-data-architecture.yaml +66 -0
- package/courses/aws-lambda-debugging/scenarios/level-4/serverless-migration-strategy.yaml +65 -0
- package/courses/aws-lambda-debugging/scenarios/level-4/serverless-security-design.yaml +60 -0
- package/courses/aws-lambda-debugging/scenarios/level-4/serverless-testing-strategy.yaml +62 -0
- package/courses/aws-lambda-debugging/scenarios/level-5/board-serverless-strategy.yaml +63 -0
- package/courses/aws-lambda-debugging/scenarios/level-5/consulting-serverless-adoption.yaml +57 -0
- package/courses/aws-lambda-debugging/scenarios/level-5/industry-serverless-patterns.yaml +62 -0
- package/courses/aws-lambda-debugging/scenarios/level-5/ma-serverless-integration.yaml +75 -0
- package/courses/aws-lambda-debugging/scenarios/level-5/master-debugging-shift.yaml +61 -0
- package/courses/aws-lambda-debugging/scenarios/level-5/organizational-serverless-transformation.yaml +65 -0
- package/courses/aws-lambda-debugging/scenarios/level-5/regulatory-serverless.yaml +61 -0
- package/courses/aws-lambda-debugging/scenarios/level-5/serverless-economics.yaml +65 -0
- package/courses/aws-lambda-debugging/scenarios/level-5/serverless-future-technology.yaml +66 -0
- package/courses/aws-lambda-debugging/scenarios/level-5/serverless-platform-design.yaml +71 -0
- package/courses/docker-container-debugging/course.yaml +11 -0
- package/courses/docker-container-debugging/scenarios/level-1/container-exit-codes.yaml +59 -0
- package/courses/docker-container-debugging/scenarios/level-1/container-networking-basics.yaml +69 -0
- package/courses/docker-container-debugging/scenarios/level-1/docker-logs-debugging.yaml +67 -0
- package/courses/docker-container-debugging/scenarios/level-1/dockerfile-build-failures.yaml +71 -0
- package/courses/docker-container-debugging/scenarios/level-1/environment-variable-issues.yaml +74 -0
- package/courses/docker-container-debugging/scenarios/level-1/first-debugging-shift.yaml +70 -0
- package/courses/docker-container-debugging/scenarios/level-1/image-pull-failures.yaml +68 -0
- package/courses/docker-container-debugging/scenarios/level-1/port-mapping-issues.yaml +67 -0
- package/courses/docker-container-debugging/scenarios/level-1/resource-limits-oom.yaml +70 -0
- package/courses/docker-container-debugging/scenarios/level-1/volume-mount-problems.yaml +66 -0
- package/courses/docker-container-debugging/scenarios/level-2/container-health-checks.yaml +73 -0
- package/courses/docker-container-debugging/scenarios/level-2/docker-compose-debugging.yaml +66 -0
- package/courses/docker-container-debugging/scenarios/level-2/docker-exec-debugging.yaml +71 -0
- package/courses/docker-container-debugging/scenarios/level-2/image-layer-optimization.yaml +81 -0
- package/courses/docker-container-debugging/scenarios/level-2/intermediate-debugging-shift.yaml +73 -0
- package/courses/docker-container-debugging/scenarios/level-2/logging-and-log-rotation.yaml +76 -0
- package/courses/docker-container-debugging/scenarios/level-2/multi-stage-build-debugging.yaml +76 -0
- package/courses/docker-container-debugging/scenarios/level-2/network-debugging-tools.yaml +67 -0
- package/courses/docker-container-debugging/scenarios/level-2/pid1-signal-handling.yaml +71 -0
- package/courses/docker-container-debugging/scenarios/level-2/security-scanning-basics.yaml +67 -0
- package/courses/docker-container-debugging/scenarios/level-3/advanced-debugging-shift.yaml +77 -0
- package/courses/docker-container-debugging/scenarios/level-3/buildkit-optimization.yaml +67 -0
- package/courses/docker-container-debugging/scenarios/level-3/container-filesystem-debugging.yaml +70 -0
- package/courses/docker-container-debugging/scenarios/level-3/container-security-hardening.yaml +74 -0
- package/courses/docker-container-debugging/scenarios/level-3/disk-space-management.yaml +74 -0
- package/courses/docker-container-debugging/scenarios/level-3/docker-api-automation.yaml +72 -0
- package/courses/docker-container-debugging/scenarios/level-3/docker-daemon-issues.yaml +73 -0
- package/courses/docker-container-debugging/scenarios/level-3/docker-in-docker-ci.yaml +69 -0
- package/courses/docker-container-debugging/scenarios/level-3/overlay-network-debugging.yaml +70 -0
- package/courses/docker-container-debugging/scenarios/level-3/production-container-ops.yaml +71 -0
- package/courses/docker-container-debugging/scenarios/level-4/cicd-pipeline-design.yaml +66 -0
- package/courses/docker-container-debugging/scenarios/level-4/container-monitoring-observability.yaml +63 -0
- package/courses/docker-container-debugging/scenarios/level-4/container-orchestration-strategy.yaml +62 -0
- package/courses/docker-container-debugging/scenarios/level-4/container-performance-engineering.yaml +64 -0
- package/courses/docker-container-debugging/scenarios/level-4/container-security-architecture.yaml +66 -0
- package/courses/docker-container-debugging/scenarios/level-4/enterprise-image-management.yaml +58 -0
- package/courses/docker-container-debugging/scenarios/level-4/expert-debugging-shift.yaml +63 -0
- package/courses/docker-container-debugging/scenarios/level-4/incident-response-containers.yaml +70 -0
- package/courses/docker-container-debugging/scenarios/level-4/multi-environment-management.yaml +65 -0
- package/courses/docker-container-debugging/scenarios/level-4/stateful-service-containers.yaml +65 -0
- package/courses/docker-container-debugging/scenarios/level-5/board-infrastructure-strategy.yaml +58 -0
- package/courses/docker-container-debugging/scenarios/level-5/consulting-container-strategy.yaml +61 -0
- package/courses/docker-container-debugging/scenarios/level-5/container-platform-architecture.yaml +67 -0
- package/courses/docker-container-debugging/scenarios/level-5/container-platform-economics.yaml +67 -0
- package/courses/docker-container-debugging/scenarios/level-5/container-technology-evolution.yaml +67 -0
- package/courses/docker-container-debugging/scenarios/level-5/disaster-recovery-containers.yaml +66 -0
- package/courses/docker-container-debugging/scenarios/level-5/industry-container-patterns.yaml +71 -0
- package/courses/docker-container-debugging/scenarios/level-5/master-debugging-shift.yaml +62 -0
- package/courses/docker-container-debugging/scenarios/level-5/organizational-transformation.yaml +67 -0
- package/courses/docker-container-debugging/scenarios/level-5/regulatory-compliance-containers.yaml +61 -0
- package/courses/kubernetes-deployment-troubleshooting/course.yaml +12 -0
- package/courses/kubernetes-deployment-troubleshooting/scenarios/level-1/configmap-secret-issues.yaml +69 -0
- package/courses/kubernetes-deployment-troubleshooting/scenarios/level-1/crashloopbackoff.yaml +68 -0
- package/courses/kubernetes-deployment-troubleshooting/scenarios/level-1/deployment-rollout.yaml +56 -0
- package/courses/kubernetes-deployment-troubleshooting/scenarios/level-1/first-troubleshooting-shift.yaml +65 -0
- package/courses/kubernetes-deployment-troubleshooting/scenarios/level-1/health-probe-failures.yaml +70 -0
- package/courses/kubernetes-deployment-troubleshooting/scenarios/level-1/imagepullbackoff.yaml +57 -0
- package/courses/kubernetes-deployment-troubleshooting/scenarios/level-1/kubectl-debugging-basics.yaml +56 -0
- package/courses/kubernetes-deployment-troubleshooting/scenarios/level-1/oomkilled.yaml +70 -0
- package/courses/kubernetes-deployment-troubleshooting/scenarios/level-1/pending-pods.yaml +68 -0
- package/courses/kubernetes-deployment-troubleshooting/scenarios/level-1/service-not-reachable.yaml +66 -0
- package/courses/kubernetes-deployment-troubleshooting/scenarios/level-2/dns-resolution-failures.yaml +63 -0
- package/courses/kubernetes-deployment-troubleshooting/scenarios/level-2/helm-deployment-failures.yaml +63 -0
- package/courses/kubernetes-deployment-troubleshooting/scenarios/level-2/hpa-scaling-issues.yaml +62 -0
- package/courses/kubernetes-deployment-troubleshooting/scenarios/level-2/ingress-routing-issues.yaml +63 -0
- package/courses/kubernetes-deployment-troubleshooting/scenarios/level-2/init-container-failures.yaml +63 -0
- package/courses/kubernetes-deployment-troubleshooting/scenarios/level-2/intermediate-troubleshooting-shift.yaml +66 -0
- package/courses/kubernetes-deployment-troubleshooting/scenarios/level-2/network-policy-blocking.yaml +67 -0
- package/courses/kubernetes-deployment-troubleshooting/scenarios/level-2/persistent-volume-issues.yaml +69 -0
- package/courses/kubernetes-deployment-troubleshooting/scenarios/level-2/rbac-permission-denied.yaml +57 -0
- package/courses/kubernetes-deployment-troubleshooting/scenarios/level-2/resource-quota-limits.yaml +64 -0
- package/courses/kubernetes-deployment-troubleshooting/scenarios/level-3/advanced-troubleshooting-shift.yaml +69 -0
- package/courses/kubernetes-deployment-troubleshooting/scenarios/level-3/cluster-upgrade-failures.yaml +71 -0
- package/courses/kubernetes-deployment-troubleshooting/scenarios/level-3/gitops-drift-detection.yaml +62 -0
- package/courses/kubernetes-deployment-troubleshooting/scenarios/level-3/job-cronjob-failures.yaml +67 -0
- package/courses/kubernetes-deployment-troubleshooting/scenarios/level-3/monitoring-alerting-gaps.yaml +64 -0
- package/courses/kubernetes-deployment-troubleshooting/scenarios/level-3/multi-container-debugging.yaml +68 -0
- package/courses/kubernetes-deployment-troubleshooting/scenarios/level-3/node-pressure-evictions.yaml +70 -0
- package/courses/kubernetes-deployment-troubleshooting/scenarios/level-3/pod-disruption-budgets.yaml +59 -0
- package/courses/kubernetes-deployment-troubleshooting/scenarios/level-3/service-mesh-debugging.yaml +64 -0
- package/courses/kubernetes-deployment-troubleshooting/scenarios/level-3/statefulset-troubleshooting.yaml +69 -0
- package/courses/kubernetes-deployment-troubleshooting/scenarios/level-4/capacity-planning.yaml +65 -0
- package/courses/kubernetes-deployment-troubleshooting/scenarios/level-4/cost-optimization.yaml +57 -0
- package/courses/kubernetes-deployment-troubleshooting/scenarios/level-4/disaster-recovery-design.yaml +56 -0
- package/courses/kubernetes-deployment-troubleshooting/scenarios/level-4/executive-communication.yaml +62 -0
- package/courses/kubernetes-deployment-troubleshooting/scenarios/level-4/expert-troubleshooting-shift.yaml +65 -0
- package/courses/kubernetes-deployment-troubleshooting/scenarios/level-4/incident-management-process.yaml +59 -0
- package/courses/kubernetes-deployment-troubleshooting/scenarios/level-4/multi-cluster-operations.yaml +62 -0
- package/courses/kubernetes-deployment-troubleshooting/scenarios/level-4/multi-tenancy-design.yaml +55 -0
- package/courses/kubernetes-deployment-troubleshooting/scenarios/level-4/platform-engineering.yaml +59 -0
- package/courses/kubernetes-deployment-troubleshooting/scenarios/level-4/security-hardening.yaml +58 -0
- package/courses/kubernetes-deployment-troubleshooting/scenarios/level-5/behavioral-science.yaml +62 -0
- package/courses/kubernetes-deployment-troubleshooting/scenarios/level-5/board-strategy.yaml +61 -0
- package/courses/kubernetes-deployment-troubleshooting/scenarios/level-5/cloud-native-future.yaml +65 -0
- package/courses/kubernetes-deployment-troubleshooting/scenarios/level-5/comprehensive-platform.yaml +57 -0
- package/courses/kubernetes-deployment-troubleshooting/scenarios/level-5/consulting-engagement.yaml +62 -0
- package/courses/kubernetes-deployment-troubleshooting/scenarios/level-5/industry-benchmarks.yaml +58 -0
- package/courses/kubernetes-deployment-troubleshooting/scenarios/level-5/ma-integration.yaml +62 -0
- package/courses/kubernetes-deployment-troubleshooting/scenarios/level-5/master-troubleshooting-shift.yaml +73 -0
- package/courses/kubernetes-deployment-troubleshooting/scenarios/level-5/product-development.yaml +65 -0
- package/courses/kubernetes-deployment-troubleshooting/scenarios/level-5/regulatory-compliance.yaml +76 -0
- package/courses/mysql-query-optimization/course.yaml +11 -0
- package/courses/mysql-query-optimization/scenarios/level-1/buffer-pool-basics.yaml +65 -0
- package/courses/mysql-query-optimization/scenarios/level-1/explain-basics.yaml +66 -0
- package/courses/mysql-query-optimization/scenarios/level-1/first-optimization-shift.yaml +78 -0
- package/courses/mysql-query-optimization/scenarios/level-1/innodb-index-fundamentals.yaml +68 -0
- package/courses/mysql-query-optimization/scenarios/level-1/join-basics.yaml +66 -0
- package/courses/mysql-query-optimization/scenarios/level-1/n-plus-one-queries.yaml +67 -0
- package/courses/mysql-query-optimization/scenarios/level-1/query-rewriting-basics.yaml +66 -0
- package/courses/mysql-query-optimization/scenarios/level-1/select-star-problems.yaml +68 -0
- package/courses/mysql-query-optimization/scenarios/level-1/slow-query-diagnosis.yaml +65 -0
- package/courses/mysql-query-optimization/scenarios/level-1/where-clause-optimization.yaml +65 -0
- package/courses/mysql-query-optimization/scenarios/level-2/buffer-pool-tuning.yaml +64 -0
- package/courses/mysql-query-optimization/scenarios/level-2/composite-index-design.yaml +71 -0
- package/courses/mysql-query-optimization/scenarios/level-2/covering-and-invisible-indexes.yaml +69 -0
- package/courses/mysql-query-optimization/scenarios/level-2/cte-and-window-functions.yaml +78 -0
- package/courses/mysql-query-optimization/scenarios/level-2/intermediate-optimization-shift.yaml +68 -0
- package/courses/mysql-query-optimization/scenarios/level-2/join-optimization.yaml +67 -0
- package/courses/mysql-query-optimization/scenarios/level-2/performance-schema-analysis.yaml +69 -0
- package/courses/mysql-query-optimization/scenarios/level-2/query-optimizer-hints.yaml +74 -0
- package/courses/mysql-query-optimization/scenarios/level-2/subquery-optimization.yaml +70 -0
- package/courses/mysql-query-optimization/scenarios/level-2/write-optimization.yaml +63 -0
- package/courses/mysql-query-optimization/scenarios/level-3/advanced-optimization-shift.yaml +71 -0
- package/courses/mysql-query-optimization/scenarios/level-3/connection-management.yaml +67 -0
- package/courses/mysql-query-optimization/scenarios/level-3/full-text-search.yaml +77 -0
- package/courses/mysql-query-optimization/scenarios/level-3/json-optimization.yaml +87 -0
- package/courses/mysql-query-optimization/scenarios/level-3/lock-contention-analysis.yaml +68 -0
- package/courses/mysql-query-optimization/scenarios/level-3/monitoring-alerting.yaml +63 -0
- package/courses/mysql-query-optimization/scenarios/level-3/online-schema-changes.yaml +79 -0
- package/courses/mysql-query-optimization/scenarios/level-3/partitioning-strategies.yaml +83 -0
- package/courses/mysql-query-optimization/scenarios/level-3/query-profiling-deep-dive.yaml +84 -0
- package/courses/mysql-query-optimization/scenarios/level-3/replication-optimization.yaml +66 -0
- package/courses/mysql-query-optimization/scenarios/level-4/aurora-vs-rds-evaluation.yaml +61 -0
- package/courses/mysql-query-optimization/scenarios/level-4/data-architecture.yaml +62 -0
- package/courses/mysql-query-optimization/scenarios/level-4/database-migration-planning.yaml +59 -0
- package/courses/mysql-query-optimization/scenarios/level-4/enterprise-governance.yaml +50 -0
- package/courses/mysql-query-optimization/scenarios/level-4/executive-communication.yaml +54 -0
- package/courses/mysql-query-optimization/scenarios/level-4/expert-optimization-shift.yaml +67 -0
- package/courses/mysql-query-optimization/scenarios/level-4/high-availability-architecture.yaml +60 -0
- package/courses/mysql-query-optimization/scenarios/level-4/optimizer-internals.yaml +62 -0
- package/courses/mysql-query-optimization/scenarios/level-4/performance-sla-design.yaml +52 -0
- package/courses/mysql-query-optimization/scenarios/level-4/read-replica-scaling.yaml +51 -0
- package/courses/mysql-query-optimization/scenarios/level-5/ai-database-future.yaml +45 -0
- package/courses/mysql-query-optimization/scenarios/level-5/behavioral-science.yaml +44 -0
- package/courses/mysql-query-optimization/scenarios/level-5/benchmark-design.yaml +47 -0
- package/courses/mysql-query-optimization/scenarios/level-5/board-strategy.yaml +48 -0
- package/courses/mysql-query-optimization/scenarios/level-5/comprehensive-platform.yaml +49 -0
- package/courses/mysql-query-optimization/scenarios/level-5/consulting-engagement.yaml +52 -0
- package/courses/mysql-query-optimization/scenarios/level-5/ma-database-integration.yaml +47 -0
- package/courses/mysql-query-optimization/scenarios/level-5/master-optimization-shift.yaml +56 -0
- package/courses/mysql-query-optimization/scenarios/level-5/product-development.yaml +48 -0
- package/courses/mysql-query-optimization/scenarios/level-5/regulatory-compliance.yaml +48 -0
- package/courses/postgresql-query-optimization/scenarios/level-5/comprehensive-database-system.yaml +70 -0
- package/courses/postgresql-query-optimization/scenarios/level-5/database-ai-future.yaml +81 -0
- package/courses/postgresql-query-optimization/scenarios/level-5/database-behavioral-science.yaml +63 -0
- package/courses/postgresql-query-optimization/scenarios/level-5/database-board-strategy.yaml +77 -0
- package/courses/postgresql-query-optimization/scenarios/level-5/database-consulting-engagement.yaml +61 -0
- package/courses/postgresql-query-optimization/scenarios/level-5/database-industry-benchmarks.yaml +64 -0
- package/courses/postgresql-query-optimization/scenarios/level-5/database-ma-integration.yaml +71 -0
- package/courses/postgresql-query-optimization/scenarios/level-5/database-product-development.yaml +72 -0
- package/courses/postgresql-query-optimization/scenarios/level-5/database-regulatory-landscape.yaml +76 -0
- package/courses/postgresql-query-optimization/scenarios/level-5/master-optimization-shift.yaml +66 -0
- package/courses/terraform-infrastructure-setup/course.yaml +11 -0
- package/courses/terraform-infrastructure-setup/scenarios/level-1/hcl-syntax-errors.yaml +65 -0
- package/courses/terraform-infrastructure-setup/scenarios/level-1/provider-configuration.yaml +62 -0
- package/courses/terraform-infrastructure-setup/scenarios/level-1/terraform-init-errors.yaml +72 -0
- package/courses/terraform-infrastructure-setup/scenarios/level-1/variable-and-output-errors.yaml +78 -0
- package/dist/mcp/session-manager.d.ts +7 -4
- package/dist/mcp/session-manager.d.ts.map +1 -1
- package/dist/mcp/session-manager.js +23 -8
- package/dist/mcp/session-manager.js.map +1 -1
- 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"
|
package/courses/docker-container-debugging/scenarios/level-2/intermediate-debugging-shift.yaml
ADDED
|
@@ -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"
|