@hybridlabor-api/aos 4.8.0 → 4.9.0
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/.agents/agents.md +1 -1
- package/.agents/nodes.json +1 -1
- package/.agents/vendor-manifest.json +23 -1
- package/.claude/agents/godmode-media-eventtech.md +1 -1
- package/.claude/hooks/conventional-commits.mjs +125 -0
- package/.claude/hooks/env-file-protection.mjs +105 -0
- package/.claude/hooks/go-gate.mjs +101 -81
- package/.claude/settings.json +13 -0
- package/.opencode/agents/godmode-media-eventtech.md +1 -1
- package/.opencode/plugins/bdb-aos.js +31 -4
- package/README.de.md +1 -1
- package/README.md +1 -1
- package/README.pt.md +1 -1
- package/THIRD_PARTY_NOTICES.md +88 -0
- package/docs/skills_table.md +1 -1
- package/installer.js +174 -46
- package/package.json +6 -2
- package/packages/aos-cli/README.md +80 -0
- package/packages/aos-cli/bin/aos-cli.mjs +134 -0
- package/packages/aos-cli/core-skills.json +12 -0
- package/packages/aos-cli/extensions/aos.ts +321 -0
- package/packages/aos-cli/package-lock.json +1923 -0
- package/packages/aos-cli/package.json +29 -0
- package/packages/aos-cli/scripts/check-theme.mjs +63 -0
- package/packages/aos-cli/themes/aos.json +97 -0
- package/scripts/build-plugin-manifest.mjs +131 -0
- package/scripts/validate-skills.mjs +81 -6
- package/skills/basic/ao-orchestrator/SKILL.md +116 -0
- package/skills/global_config/agenttrail/SKILL.md +6 -1
- package/skills/global_config/ask-tim/SKILL.md +4 -4
- package/skills/global_config/bash-script-generator/SKILL.md +201 -0
- package/skills/global_config/bash-script-generator/assets/templates/standard-template.sh +96 -0
- package/skills/global_config/bash-script-generator/docs/bash-scripting-guide.md +729 -0
- package/skills/global_config/bash-script-generator/docs/generation-best-practices.md +193 -0
- package/skills/global_config/bash-script-generator/docs/script-patterns.md +566 -0
- package/skills/global_config/bash-script-generator/docs/text-processing-guide.md +437 -0
- package/skills/global_config/bash-script-generator/examples/log-analyzer.sh +92 -0
- package/skills/global_config/bash-script-generator/scripts/generate_script_template.sh +123 -0
- package/skills/global_config/bash-script-generator/scripts/run_ci_checks.sh +172 -0
- package/skills/global_config/bash-script-generator/scripts/test_generator.sh +413 -0
- package/skills/global_config/bash-script-validator/SKILL.md +249 -0
- package/skills/global_config/bash-script-validator/docs/awk-reference.md +449 -0
- package/skills/global_config/bash-script-validator/docs/bash-reference.md +468 -0
- package/skills/global_config/bash-script-validator/docs/common-mistakes.md +623 -0
- package/skills/global_config/bash-script-validator/docs/grep-reference.md +395 -0
- package/skills/global_config/bash-script-validator/docs/regex-reference.md +391 -0
- package/skills/global_config/bash-script-validator/docs/sed-reference.md +454 -0
- package/skills/global_config/bash-script-validator/docs/shell-reference.md +463 -0
- package/skills/global_config/bash-script-validator/docs/shellcheck-reference.md +399 -0
- package/skills/global_config/bash-script-validator/examples/bad-bash.sh +55 -0
- package/skills/global_config/bash-script-validator/examples/bad-shell.sh +54 -0
- package/skills/global_config/bash-script-validator/examples/good-bash.sh +71 -0
- package/skills/global_config/bash-script-validator/examples/good-shell.sh +69 -0
- package/skills/global_config/bash-script-validator/scripts/run_ci_checks.sh +23 -0
- package/skills/global_config/bash-script-validator/scripts/shellcheck_wrapper.sh +174 -0
- package/skills/global_config/bash-script-validator/scripts/test_validate.sh +446 -0
- package/skills/global_config/bash-script-validator/scripts/validate.sh +512 -0
- package/skills/global_config/ci-pipeline/SKILL.md +135 -0
- package/skills/global_config/dispatching-parallel-agents/SKILL.md +170 -0
- package/skills/global_config/dockerfile-generator/SKILL.md +1038 -0
- package/skills/global_config/dockerfile-generator/examples/example.dockerignore +95 -0
- package/skills/global_config/dockerfile-generator/examples/golang-distroless.Dockerfile +34 -0
- package/skills/global_config/dockerfile-generator/examples/java-springboot.Dockerfile +45 -0
- package/skills/global_config/dockerfile-generator/examples/nextjs-production.Dockerfile +49 -0
- package/skills/global_config/dockerfile-generator/examples/nodejs-multistage.Dockerfile +55 -0
- package/skills/global_config/dockerfile-generator/examples/python-fastapi.Dockerfile +48 -0
- package/skills/global_config/dockerfile-generator/references/language_specific_guides.md +510 -0
- package/skills/global_config/dockerfile-generator/references/multistage_builds.md +570 -0
- package/skills/global_config/dockerfile-generator/references/optimization_patterns.md +492 -0
- package/skills/global_config/dockerfile-generator/references/security_best_practices.md +375 -0
- package/skills/global_config/dockerfile-generator/scripts/generate_dockerignore.sh +199 -0
- package/skills/global_config/dockerfile-generator/scripts/generate_golang.sh +172 -0
- package/skills/global_config/dockerfile-generator/scripts/generate_java.sh +185 -0
- package/skills/global_config/dockerfile-generator/scripts/generate_nodejs.sh +279 -0
- package/skills/global_config/dockerfile-generator/scripts/generate_python.sh +218 -0
- package/skills/global_config/dockerfile-generator/scripts/test_generator.sh +210 -0
- package/skills/global_config/dockerfile-validator/SKILL.md +300 -0
- package/skills/global_config/dockerfile-validator/examples/.dockerignore.example +34 -0
- package/skills/global_config/dockerfile-validator/examples/bad-example.Dockerfile +37 -0
- package/skills/global_config/dockerfile-validator/examples/golang-distroless.Dockerfile +50 -0
- package/skills/global_config/dockerfile-validator/examples/good-example.Dockerfile +52 -0
- package/skills/global_config/dockerfile-validator/examples/python-optimized.Dockerfile +53 -0
- package/skills/global_config/dockerfile-validator/examples/security-issues.Dockerfile +42 -0
- package/skills/global_config/dockerfile-validator/references/docker_best_practices.md +348 -0
- package/skills/global_config/dockerfile-validator/references/optimization_guide.md +473 -0
- package/skills/global_config/dockerfile-validator/references/security_checklist.md +208 -0
- package/skills/global_config/dockerfile-validator/scripts/dockerfile-validate.sh +699 -0
- package/skills/global_config/dockerfile-validator/scripts/test_validate.sh +35 -0
- package/skills/global_config/dockerfile-validator/tests/fixtures/copy-before-yarn-lock-read.Dockerfile +6 -0
- package/skills/global_config/dockerfile-validator/tests/fixtures/copy-before-yarn.Dockerfile +6 -0
- package/skills/global_config/dockerfile-validator/tests/fixtures/from-platform-nonroot.Dockerfile +7 -0
- package/skills/global_config/dockerfile-validator/tests/test_regression.sh +164 -0
- package/skills/global_config/finishing-a-development-branch/SKILL.md +228 -0
- package/skills/global_config/github-actions-generator/SKILL.md +353 -0
- package/skills/global_config/github-actions-generator/assets/templates/action/composite/action.yml +82 -0
- package/skills/global_config/github-actions-generator/assets/templates/action/docker/Dockerfile +25 -0
- package/skills/global_config/github-actions-generator/assets/templates/action/docker/action.yml +42 -0
- package/skills/global_config/github-actions-generator/assets/templates/action/docker/entrypoint.sh +27 -0
- package/skills/global_config/github-actions-generator/assets/templates/action/javascript/action.yml +33 -0
- package/skills/global_config/github-actions-generator/assets/templates/action/javascript/index.js +50 -0
- package/skills/global_config/github-actions-generator/assets/templates/action/javascript/package.json +27 -0
- package/skills/global_config/github-actions-generator/assets/templates/workflow/basic_workflow.yml +242 -0
- package/skills/global_config/github-actions-generator/assets/templates/workflow/reusable_workflow.yml +106 -0
- package/skills/global_config/github-actions-generator/examples/README.md +147 -0
- package/skills/global_config/github-actions-generator/examples/actions/setup-node-cached/action.yml +93 -0
- package/skills/global_config/github-actions-generator/examples/caching/docker-buildkit.yml +256 -0
- package/skills/global_config/github-actions-generator/examples/security/dependency-review.yml +62 -0
- package/skills/global_config/github-actions-generator/examples/security/sbom-attestation.yml +119 -0
- package/skills/global_config/github-actions-generator/examples/triggers/chatops-commands.yml +475 -0
- package/skills/global_config/github-actions-generator/examples/triggers/repository-dispatch.yml +418 -0
- package/skills/global_config/github-actions-generator/examples/triggers/workflow-orchestration.yml +404 -0
- package/skills/global_config/github-actions-generator/examples/workflows/docker-build-push.yml +68 -0
- package/skills/global_config/github-actions-generator/examples/workflows/go-ci.yml +161 -0
- package/skills/global_config/github-actions-generator/examples/workflows/monorepo-ci.yml +340 -0
- package/skills/global_config/github-actions-generator/examples/workflows/multi-environment-deploy.yml +406 -0
- package/skills/global_config/github-actions-generator/examples/workflows/nodejs-ci.yml +122 -0
- package/skills/global_config/github-actions-generator/examples/workflows/python-ci.yml +157 -0
- package/skills/global_config/github-actions-generator/examples/workflows/scheduled-tasks.yml +376 -0
- package/skills/global_config/github-actions-generator/references/advanced-triggers.md +917 -0
- package/skills/global_config/github-actions-generator/references/best-practices.md +755 -0
- package/skills/global_config/github-actions-generator/references/common-actions.md +715 -0
- package/skills/global_config/github-actions-generator/references/custom-actions.md +320 -0
- package/skills/global_config/github-actions-generator/references/expressions-and-contexts.md +688 -0
- package/skills/global_config/github-actions-generator/references/modern-features.md +421 -0
- package/skills/global_config/github-actions-generator/scripts/test_generator.sh +344 -0
- package/skills/global_config/github-actions-templates/SKILL.md +7 -0
- package/skills/global_config/github-actions-validator/SKILL.md +576 -0
- package/skills/global_config/github-actions-validator/examples/README.md +88 -0
- package/skills/global_config/github-actions-validator/examples/outdated-versions.yml +76 -0
- package/skills/global_config/github-actions-validator/examples/valid-ci.yml +79 -0
- package/skills/global_config/github-actions-validator/examples/with-errors.yml +47 -0
- package/skills/global_config/github-actions-validator/references/act_usage.md +233 -0
- package/skills/global_config/github-actions-validator/references/action_versions.md +122 -0
- package/skills/global_config/github-actions-validator/references/actionlint_usage.md +343 -0
- package/skills/global_config/github-actions-validator/references/common_errors.md +512 -0
- package/skills/global_config/github-actions-validator/references/modern_features.md +384 -0
- package/skills/global_config/github-actions-validator/references/runners.md +317 -0
- package/skills/global_config/github-actions-validator/scripts/install_tools.sh +113 -0
- package/skills/global_config/github-actions-validator/scripts/validate_workflow.sh +910 -0
- package/skills/global_config/github-actions-validator/tests/test_validate_workflow.sh +237 -0
- package/skills/global_config/makefile-generator/SKILL.md +614 -0
- package/skills/global_config/makefile-generator/assets/templates/.gitkeep +1 -0
- package/skills/global_config/makefile-generator/docs/makefile-structure.md +530 -0
- package/skills/global_config/makefile-generator/docs/optimization-guide.md +784 -0
- package/skills/global_config/makefile-generator/docs/patterns-guide.md +642 -0
- package/skills/global_config/makefile-generator/docs/security-guide.md +361 -0
- package/skills/global_config/makefile-generator/docs/targets-guide.md +642 -0
- package/skills/global_config/makefile-generator/docs/variables-guide.md +596 -0
- package/skills/global_config/makefile-generator/scripts/add_standard_targets.sh +539 -0
- package/skills/global_config/makefile-generator/scripts/generate_makefile_template.sh +690 -0
- package/skills/global_config/makefile-generator/test/test_helper_scripts.sh +190 -0
- package/skills/global_config/makefile-validator/SKILL.md +244 -0
- package/skills/global_config/makefile-validator/docs/bake-tool.md +1000 -0
- package/skills/global_config/makefile-validator/docs/best-practices.md +858 -0
- package/skills/global_config/makefile-validator/docs/common-mistakes.md +944 -0
- package/skills/global_config/makefile-validator/examples/bad-makefile.mk +77 -0
- package/skills/global_config/makefile-validator/examples/good-makefile.mk +103 -0
- package/skills/global_config/makefile-validator/scripts/test_validate.sh +382 -0
- package/skills/global_config/makefile-validator/scripts/validate_makefile.sh +712 -0
- package/skills/global_config/{MCP_Manage → mcp-manage}/SKILL.md +3 -3
- package/skills/global_config/requesting-code-review/SKILL.md +98 -0
- package/skills/global_config/requesting-code-review/code-reviewer.md +198 -0
- package/skills/global_config/using-git-worktrees/SKILL.md +170 -0
- package/skills/global_config/verification-before-completion/SKILL.md +123 -0
- package/skills/global_config/writing-plans/SKILL.md +126 -46
- package/skills/global_config/writing-plans-legacy/SKILL.md +139 -0
|
@@ -0,0 +1,492 @@
|
|
|
1
|
+
# Dockerfile Optimization Patterns
|
|
2
|
+
|
|
3
|
+
## Overview
|
|
4
|
+
|
|
5
|
+
This guide provides comprehensive optimization techniques for reducing Docker image size, improving build times, and enhancing runtime performance.
|
|
6
|
+
|
|
7
|
+
## Image Size Optimization
|
|
8
|
+
|
|
9
|
+
### Use Multi-Stage Builds
|
|
10
|
+
|
|
11
|
+
**Impact:** 50-85% size reduction
|
|
12
|
+
|
|
13
|
+
```dockerfile
|
|
14
|
+
# Before: Single stage (500MB)
|
|
15
|
+
FROM node:20
|
|
16
|
+
WORKDIR /app
|
|
17
|
+
COPY . .
|
|
18
|
+
RUN npm install
|
|
19
|
+
RUN npm run build
|
|
20
|
+
CMD ["node", "dist/server.js"]
|
|
21
|
+
|
|
22
|
+
# After: Multi-stage (150MB)
|
|
23
|
+
FROM node:20 AS builder
|
|
24
|
+
WORKDIR /app
|
|
25
|
+
COPY package*.json ./
|
|
26
|
+
RUN npm ci
|
|
27
|
+
COPY . .
|
|
28
|
+
RUN npm run build
|
|
29
|
+
|
|
30
|
+
FROM node:20-alpine
|
|
31
|
+
WORKDIR /app
|
|
32
|
+
COPY --from=builder /app/dist ./dist
|
|
33
|
+
COPY --from=builder /app/node_modules ./node_modules
|
|
34
|
+
CMD ["node", "dist/server.js"]
|
|
35
|
+
```
|
|
36
|
+
|
|
37
|
+
### Choose Minimal Base Images
|
|
38
|
+
|
|
39
|
+
**Size Comparison:**
|
|
40
|
+
```
|
|
41
|
+
ubuntu:22.04 → 77MB
|
|
42
|
+
node:20 → 996MB
|
|
43
|
+
node:20-slim → 239MB
|
|
44
|
+
node:20-alpine → 132MB
|
|
45
|
+
alpine:3.21 → 7.8MB
|
|
46
|
+
distroless/static → 2MB
|
|
47
|
+
scratch → 0MB
|
|
48
|
+
```
|
|
49
|
+
|
|
50
|
+
**Selection Guide:**
|
|
51
|
+
- **Full OS (ubuntu, debian):** When you need many system tools
|
|
52
|
+
- **Slim variants:** Good balance of size and compatibility
|
|
53
|
+
- **Alpine:** Minimal size, may have glibc compatibility issues
|
|
54
|
+
- **Distroless:** Highest security, minimal attack surface
|
|
55
|
+
- **Scratch:** For static binaries only (Go, Rust)
|
|
56
|
+
|
|
57
|
+
### Remove Unnecessary Files
|
|
58
|
+
|
|
59
|
+
```dockerfile
|
|
60
|
+
# Clean up in same RUN layer
|
|
61
|
+
RUN apt-get update && \
|
|
62
|
+
apt-get install -y --no-install-recommends curl && \
|
|
63
|
+
rm -rf /var/lib/apt/lists/*
|
|
64
|
+
|
|
65
|
+
# Remove build artifacts
|
|
66
|
+
RUN npm run build && \
|
|
67
|
+
rm -rf src/ tests/ docs/
|
|
68
|
+
|
|
69
|
+
# Use .dockerignore
|
|
70
|
+
# (prevents files from being sent to build context)
|
|
71
|
+
```
|
|
72
|
+
|
|
73
|
+
## Build Time Optimization
|
|
74
|
+
|
|
75
|
+
### Layer Caching Strategy
|
|
76
|
+
|
|
77
|
+
**Order instructions from least to most frequently changing:**
|
|
78
|
+
|
|
79
|
+
```dockerfile
|
|
80
|
+
# Bad - Invalidates cache on any code change
|
|
81
|
+
COPY . /app
|
|
82
|
+
RUN npm install
|
|
83
|
+
|
|
84
|
+
# Good - Cache dependencies separately
|
|
85
|
+
COPY package*.json /app/
|
|
86
|
+
RUN npm install
|
|
87
|
+
COPY . /app
|
|
88
|
+
```
|
|
89
|
+
|
|
90
|
+
**Optimal Layer Order:**
|
|
91
|
+
1. Base image (FROM)
|
|
92
|
+
2. System packages (RUN apt-get)
|
|
93
|
+
3. Application dependencies (package.json, requirements.txt)
|
|
94
|
+
4. Application code (COPY . .)
|
|
95
|
+
5. Build commands (RUN build)
|
|
96
|
+
6. Runtime configuration (CMD, ENTRYPOINT)
|
|
97
|
+
|
|
98
|
+
### BuildKit Cache Mounts
|
|
99
|
+
|
|
100
|
+
**Mount external caches to persist across builds:**
|
|
101
|
+
|
|
102
|
+
```dockerfile
|
|
103
|
+
# syntax=docker/dockerfile:1
|
|
104
|
+
|
|
105
|
+
# NPM cache mount
|
|
106
|
+
FROM node:20-alpine
|
|
107
|
+
WORKDIR /app
|
|
108
|
+
COPY package*.json ./
|
|
109
|
+
RUN --mount=type=cache,target=/root/.npm \
|
|
110
|
+
npm ci
|
|
111
|
+
|
|
112
|
+
# Go module cache
|
|
113
|
+
FROM golang:1.21-alpine
|
|
114
|
+
WORKDIR /app
|
|
115
|
+
COPY go.mod go.sum ./
|
|
116
|
+
RUN --mount=type=cache,target=/go/pkg/mod \
|
|
117
|
+
go mod download
|
|
118
|
+
|
|
119
|
+
# Pip cache
|
|
120
|
+
FROM python:3.12-slim
|
|
121
|
+
WORKDIR /app
|
|
122
|
+
COPY requirements.txt .
|
|
123
|
+
RUN --mount=type=cache,target=/root/.cache/pip \
|
|
124
|
+
pip install -r requirements.txt
|
|
125
|
+
```
|
|
126
|
+
|
|
127
|
+
**Enable BuildKit:**
|
|
128
|
+
```bash
|
|
129
|
+
export DOCKER_BUILDKIT=1
|
|
130
|
+
docker build .
|
|
131
|
+
```
|
|
132
|
+
|
|
133
|
+
### Parallel Stage Execution
|
|
134
|
+
|
|
135
|
+
```dockerfile
|
|
136
|
+
# syntax=docker/dockerfile:1
|
|
137
|
+
|
|
138
|
+
FROM alpine AS fetch-1
|
|
139
|
+
RUN wget https://example.com/file1
|
|
140
|
+
|
|
141
|
+
FROM alpine AS fetch-2
|
|
142
|
+
RUN wget https://example.com/file2
|
|
143
|
+
|
|
144
|
+
FROM alpine AS final
|
|
145
|
+
COPY --from=fetch-1 /file1 .
|
|
146
|
+
COPY --from=fetch-2 /file2 .
|
|
147
|
+
```
|
|
148
|
+
|
|
149
|
+
BuildKit automatically parallelizes independent stages.
|
|
150
|
+
|
|
151
|
+
## Layer Optimization
|
|
152
|
+
|
|
153
|
+
### Combine RUN Commands
|
|
154
|
+
|
|
155
|
+
```dockerfile
|
|
156
|
+
# Bad - Creates 5 layers
|
|
157
|
+
RUN apt-get update
|
|
158
|
+
RUN apt-get install -y curl
|
|
159
|
+
RUN apt-get install -y git
|
|
160
|
+
RUN apt-get install -y vim
|
|
161
|
+
RUN rm -rf /var/lib/apt/lists/*
|
|
162
|
+
|
|
163
|
+
# Good - Creates 1 layer
|
|
164
|
+
RUN apt-get update && \
|
|
165
|
+
apt-get install -y --no-install-recommends \
|
|
166
|
+
curl \
|
|
167
|
+
git \
|
|
168
|
+
vim && \
|
|
169
|
+
rm -rf /var/lib/apt/lists/*
|
|
170
|
+
```
|
|
171
|
+
|
|
172
|
+
### Minimize Layer Count
|
|
173
|
+
|
|
174
|
+
**Each instruction creates a layer:**
|
|
175
|
+
- FROM, RUN, COPY, ADD create layers
|
|
176
|
+
- ENV, WORKDIR, EXPOSE, USER do not create significant layers
|
|
177
|
+
- Combine related operations
|
|
178
|
+
|
|
179
|
+
```dockerfile
|
|
180
|
+
# Bad - Many layers
|
|
181
|
+
COPY package.json .
|
|
182
|
+
COPY package-lock.json .
|
|
183
|
+
COPY tsconfig.json .
|
|
184
|
+
COPY src/ ./src/
|
|
185
|
+
COPY tests/ ./tests/
|
|
186
|
+
|
|
187
|
+
# Good - Fewer layers (use .dockerignore)
|
|
188
|
+
COPY . .
|
|
189
|
+
```
|
|
190
|
+
|
|
191
|
+
### Layer Size Analysis
|
|
192
|
+
|
|
193
|
+
```bash
|
|
194
|
+
# Inspect layer sizes
|
|
195
|
+
docker history myimage:latest
|
|
196
|
+
|
|
197
|
+
# Find large layers
|
|
198
|
+
docker history --no-trunc --format "table {{.Size}}\t{{.CreatedBy}}" myimage:latest | sort -hr | head -10
|
|
199
|
+
```
|
|
200
|
+
|
|
201
|
+
## Dependency Optimization
|
|
202
|
+
|
|
203
|
+
### Install Only Production Dependencies
|
|
204
|
+
|
|
205
|
+
**Node.js:**
|
|
206
|
+
```dockerfile
|
|
207
|
+
# Development dependencies excluded
|
|
208
|
+
RUN npm ci --only=production
|
|
209
|
+
|
|
210
|
+
# Or use package.json scripts
|
|
211
|
+
RUN npm ci --omit=dev
|
|
212
|
+
```
|
|
213
|
+
|
|
214
|
+
**Python:**
|
|
215
|
+
```dockerfile
|
|
216
|
+
# Create separate requirements files
|
|
217
|
+
# requirements.txt (production)
|
|
218
|
+
# requirements-dev.txt (development)
|
|
219
|
+
RUN pip install --no-cache-dir -r requirements.txt
|
|
220
|
+
```
|
|
221
|
+
|
|
222
|
+
**Java (Maven):**
|
|
223
|
+
```dockerfile
|
|
224
|
+
# Skip tests during build
|
|
225
|
+
RUN ./mvnw clean package -DskipTests
|
|
226
|
+
```
|
|
227
|
+
|
|
228
|
+
### Remove Development Tools
|
|
229
|
+
|
|
230
|
+
```dockerfile
|
|
231
|
+
# Multi-stage: Keep build tools in builder stage
|
|
232
|
+
FROM golang:1.21 AS builder
|
|
233
|
+
RUN apk add --no-cache git make
|
|
234
|
+
RUN make build
|
|
235
|
+
|
|
236
|
+
FROM alpine:3.21
|
|
237
|
+
# No build tools in final image
|
|
238
|
+
COPY --from=builder /app/binary /app/
|
|
239
|
+
```
|
|
240
|
+
|
|
241
|
+
## .dockerignore Optimization
|
|
242
|
+
|
|
243
|
+
**Reduces build context size and build time:**
|
|
244
|
+
|
|
245
|
+
```dockerignore
|
|
246
|
+
# Version control
|
|
247
|
+
.git
|
|
248
|
+
.gitignore
|
|
249
|
+
|
|
250
|
+
# Dependencies (installed during build)
|
|
251
|
+
node_modules
|
|
252
|
+
vendor
|
|
253
|
+
__pycache__
|
|
254
|
+
|
|
255
|
+
# IDE files
|
|
256
|
+
.vscode
|
|
257
|
+
.idea
|
|
258
|
+
*.swp
|
|
259
|
+
|
|
260
|
+
# Build artifacts
|
|
261
|
+
dist
|
|
262
|
+
build
|
|
263
|
+
target
|
|
264
|
+
|
|
265
|
+
# Documentation
|
|
266
|
+
*.md
|
|
267
|
+
docs/
|
|
268
|
+
|
|
269
|
+
# CI/CD
|
|
270
|
+
.github
|
|
271
|
+
.gitlab-ci.yml
|
|
272
|
+
|
|
273
|
+
# Environment files
|
|
274
|
+
.env
|
|
275
|
+
.env.*
|
|
276
|
+
|
|
277
|
+
# Logs
|
|
278
|
+
*.log
|
|
279
|
+
logs/
|
|
280
|
+
|
|
281
|
+
# Tests
|
|
282
|
+
tests/
|
|
283
|
+
*.test
|
|
284
|
+
coverage/
|
|
285
|
+
```
|
|
286
|
+
|
|
287
|
+
**Impact:**
|
|
288
|
+
- Smaller build context → Faster upload to Docker daemon
|
|
289
|
+
- Fewer files → Faster COPY operations
|
|
290
|
+
- No accidental secret leaks
|
|
291
|
+
|
|
292
|
+
## Runtime Performance
|
|
293
|
+
|
|
294
|
+
### Use Exec Form for CMD/ENTRYPOINT
|
|
295
|
+
|
|
296
|
+
```dockerfile
|
|
297
|
+
# Bad - Shell form (spawns extra sh process)
|
|
298
|
+
CMD node server.js
|
|
299
|
+
|
|
300
|
+
# Good - Exec form (direct process execution)
|
|
301
|
+
CMD ["node", "server.js"]
|
|
302
|
+
|
|
303
|
+
# Benefits:
|
|
304
|
+
# - Proper signal handling (SIGTERM, SIGINT)
|
|
305
|
+
# - Faster startup
|
|
306
|
+
# - Lower memory usage
|
|
307
|
+
```
|
|
308
|
+
|
|
309
|
+
### Optimize Application
|
|
310
|
+
|
|
311
|
+
```dockerfile
|
|
312
|
+
# Node.js: Use production mode
|
|
313
|
+
ENV NODE_ENV=production
|
|
314
|
+
|
|
315
|
+
# Python: Use optimized bytecode
|
|
316
|
+
ENV PYTHONOPTIMIZE=1
|
|
317
|
+
|
|
318
|
+
# Java: Set heap size
|
|
319
|
+
ENV JAVA_OPTS="-Xms512m -Xmx2048m"
|
|
320
|
+
|
|
321
|
+
# Go: Build with optimizations
|
|
322
|
+
RUN go build -ldflags="-s -w" -o app
|
|
323
|
+
```
|
|
324
|
+
|
|
325
|
+
### Health Checks
|
|
326
|
+
|
|
327
|
+
```dockerfile
|
|
328
|
+
# Efficient health check
|
|
329
|
+
HEALTHCHECK --interval=30s --timeout=3s --start-period=5s --retries=3 \
|
|
330
|
+
CMD wget --no-verbose --tries=1 --spider http://localhost:8080/health || exit 1
|
|
331
|
+
|
|
332
|
+
# Avoid heavy health checks
|
|
333
|
+
# Bad: HEALTHCHECK CMD curl http://localhost/full-db-check
|
|
334
|
+
```
|
|
335
|
+
|
|
336
|
+
## Build Optimization Checklist
|
|
337
|
+
|
|
338
|
+
- [ ] Use multi-stage builds
|
|
339
|
+
- [ ] Choose minimal base images (Alpine, distroless)
|
|
340
|
+
- [ ] Order layers from least to most frequently changing
|
|
341
|
+
- [ ] Combine RUN commands where logical
|
|
342
|
+
- [ ] Use BuildKit cache mounts
|
|
343
|
+
- [ ] Create comprehensive .dockerignore
|
|
344
|
+
- [ ] Install only production dependencies
|
|
345
|
+
- [ ] Clean package manager caches in same layer
|
|
346
|
+
- [ ] Remove development tools from final image
|
|
347
|
+
- [ ] Use exec form for CMD/ENTRYPOINT
|
|
348
|
+
- [ ] Optimize application for production
|
|
349
|
+
- [ ] Add efficient health checks
|
|
350
|
+
|
|
351
|
+
## Advanced Techniques
|
|
352
|
+
|
|
353
|
+
### Squash Layers (Use with Caution)
|
|
354
|
+
|
|
355
|
+
```bash
|
|
356
|
+
# Squash all layers into one (loses layer caching)
|
|
357
|
+
docker build --squash -t myapp:latest .
|
|
358
|
+
```
|
|
359
|
+
|
|
360
|
+
**Use Cases:**
|
|
361
|
+
- Final production images
|
|
362
|
+
- When layer caching isn't important
|
|
363
|
+
- To hide sensitive information in layers (better: use multi-stage)
|
|
364
|
+
|
|
365
|
+
**Drawbacks:**
|
|
366
|
+
- Loses layer caching benefits
|
|
367
|
+
- Larger initial download
|
|
368
|
+
- Less transparent image history
|
|
369
|
+
|
|
370
|
+
### BuildKit Secrets (Zero-Copy Secrets)
|
|
371
|
+
|
|
372
|
+
```dockerfile
|
|
373
|
+
# syntax=docker/dockerfile:1
|
|
374
|
+
FROM alpine
|
|
375
|
+
RUN --mount=type=secret,id=aws_credentials \
|
|
376
|
+
aws configure set credentials $(cat /run/secrets/aws_credentials)
|
|
377
|
+
```
|
|
378
|
+
|
|
379
|
+
```bash
|
|
380
|
+
docker build --secret id=aws_credentials,src=$HOME/.aws/credentials .
|
|
381
|
+
```
|
|
382
|
+
|
|
383
|
+
### Cross-Platform Builds
|
|
384
|
+
|
|
385
|
+
```dockerfile
|
|
386
|
+
# Build for multiple platforms
|
|
387
|
+
docker buildx build \
|
|
388
|
+
--platform linux/amd64,linux/arm64 \
|
|
389
|
+
-t myapp:latest \
|
|
390
|
+
.
|
|
391
|
+
```
|
|
392
|
+
|
|
393
|
+
## Measuring Optimization Impact
|
|
394
|
+
|
|
395
|
+
### Before and After Comparison
|
|
396
|
+
|
|
397
|
+
```bash
|
|
398
|
+
# Build original
|
|
399
|
+
docker build -t myapp:before .
|
|
400
|
+
docker images myapp:before
|
|
401
|
+
|
|
402
|
+
# Build optimized
|
|
403
|
+
docker build -t myapp:after .
|
|
404
|
+
docker images myapp:after
|
|
405
|
+
|
|
406
|
+
# Compare sizes
|
|
407
|
+
docker images --format "table {{.Repository}}\t{{.Tag}}\t{{.Size}}" | grep myapp
|
|
408
|
+
```
|
|
409
|
+
|
|
410
|
+
### Build Time Measurement
|
|
411
|
+
|
|
412
|
+
```bash
|
|
413
|
+
# Measure build time
|
|
414
|
+
time docker build -t myapp:latest .
|
|
415
|
+
|
|
416
|
+
# Measure with cache
|
|
417
|
+
docker build -t myapp:cached .
|
|
418
|
+
|
|
419
|
+
# Measure without cache
|
|
420
|
+
docker build --no-cache -t myapp:no-cache .
|
|
421
|
+
```
|
|
422
|
+
|
|
423
|
+
### Dive Tool (Layer Analysis)
|
|
424
|
+
|
|
425
|
+
```bash
|
|
426
|
+
# Install dive
|
|
427
|
+
brew install dive # macOS
|
|
428
|
+
# or download from https://github.com/wagoodman/dive
|
|
429
|
+
|
|
430
|
+
# Analyze image
|
|
431
|
+
dive myapp:latest
|
|
432
|
+
```
|
|
433
|
+
|
|
434
|
+
## Real-World Examples
|
|
435
|
+
|
|
436
|
+
### Node.js Optimization
|
|
437
|
+
|
|
438
|
+
**Before (996MB):**
|
|
439
|
+
```dockerfile
|
|
440
|
+
FROM node:20
|
|
441
|
+
WORKDIR /app
|
|
442
|
+
COPY . .
|
|
443
|
+
RUN npm install
|
|
444
|
+
CMD ["node", "server.js"]
|
|
445
|
+
```
|
|
446
|
+
|
|
447
|
+
**After (50MB, 95% reduction):**
|
|
448
|
+
```dockerfile
|
|
449
|
+
FROM node:20-alpine AS builder
|
|
450
|
+
WORKDIR /app
|
|
451
|
+
COPY package*.json ./
|
|
452
|
+
RUN npm ci --only=production
|
|
453
|
+
COPY . .
|
|
454
|
+
|
|
455
|
+
FROM node:20-alpine
|
|
456
|
+
WORKDIR /app
|
|
457
|
+
COPY --from=builder /app/node_modules ./node_modules
|
|
458
|
+
COPY --from=builder /app/server.js ./
|
|
459
|
+
CMD ["node", "server.js"]
|
|
460
|
+
```
|
|
461
|
+
|
|
462
|
+
### Go Optimization
|
|
463
|
+
|
|
464
|
+
**Before (800MB):**
|
|
465
|
+
```dockerfile
|
|
466
|
+
FROM golang:1.21
|
|
467
|
+
WORKDIR /app
|
|
468
|
+
COPY . .
|
|
469
|
+
RUN go build -o app
|
|
470
|
+
CMD ["./app"]
|
|
471
|
+
```
|
|
472
|
+
|
|
473
|
+
**After (8MB, 99% reduction):**
|
|
474
|
+
```dockerfile
|
|
475
|
+
FROM golang:1.21-alpine AS builder
|
|
476
|
+
WORKDIR /app
|
|
477
|
+
COPY go.* ./
|
|
478
|
+
RUN go mod download
|
|
479
|
+
COPY . .
|
|
480
|
+
RUN CGO_ENABLED=0 go build -ldflags="-s -w" -o app
|
|
481
|
+
|
|
482
|
+
FROM scratch
|
|
483
|
+
COPY --from=builder /app/app /app
|
|
484
|
+
ENTRYPOINT ["/app"]
|
|
485
|
+
```
|
|
486
|
+
|
|
487
|
+
## References
|
|
488
|
+
|
|
489
|
+
- [Docker Build Best Practices](https://docs.docker.com/build/building/best-practices/)
|
|
490
|
+
- [BuildKit Documentation](https://docs.docker.com/build/buildkit/)
|
|
491
|
+
- [Multi-stage Builds](https://docs.docker.com/build/building/multi-stage/)
|
|
492
|
+
- [Docker Image Size Optimization](https://betterstack.com/community/guides/scaling-docker/docker-build-best-practices/)
|