@hybridlabor-api/aos 4.7.2 → 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 +309 -101
- 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,348 @@
|
|
|
1
|
+
# Docker Best Practices Reference
|
|
2
|
+
|
|
3
|
+
This document summarizes official Docker best practices based on current recommendations from Docker documentation and industry standards.
|
|
4
|
+
|
|
5
|
+
## General Principles
|
|
6
|
+
|
|
7
|
+
### 1. Create Ephemeral Containers
|
|
8
|
+
- Containers should be as stateless and ephemeral as possible
|
|
9
|
+
- Should be able to stop, destroy, and recreate with minimal setup
|
|
10
|
+
- Align with Twelve-Factor App methodology
|
|
11
|
+
|
|
12
|
+
### 2. Understand Build Context
|
|
13
|
+
- Use `.dockerignore` to exclude unnecessary files
|
|
14
|
+
- Keep context size minimal for faster builds
|
|
15
|
+
- Don't include secrets or sensitive data in context
|
|
16
|
+
|
|
17
|
+
### 3. Use Multi-Stage Builds
|
|
18
|
+
- Separate build dependencies from runtime
|
|
19
|
+
- Dramatically reduce final image size
|
|
20
|
+
- Improve security by minimizing attack surface
|
|
21
|
+
|
|
22
|
+
### 4. One Concern Per Container
|
|
23
|
+
- Each container should address a single concern
|
|
24
|
+
- Makes containers more reusable and easier to scale
|
|
25
|
+
- Simplifies debugging and updates
|
|
26
|
+
|
|
27
|
+
## Dockerfile Instructions Best Practices
|
|
28
|
+
|
|
29
|
+
### FROM
|
|
30
|
+
|
|
31
|
+
**Use specific tags, not :latest**
|
|
32
|
+
```dockerfile
|
|
33
|
+
# Bad
|
|
34
|
+
FROM node:latest
|
|
35
|
+
|
|
36
|
+
# Good
|
|
37
|
+
FROM node:21-alpine
|
|
38
|
+
|
|
39
|
+
# Better
|
|
40
|
+
FROM node:21-alpine@sha256:abc123...
|
|
41
|
+
```
|
|
42
|
+
|
|
43
|
+
**Choose minimal base images**
|
|
44
|
+
- Alpine Linux: ~5 MB base (vs ~80 MB for Ubuntu)
|
|
45
|
+
- Distroless: No shell, package manager (minimal attack surface)
|
|
46
|
+
- Scratch: Absolutely minimal (for static binaries)
|
|
47
|
+
|
|
48
|
+
**Prefer official images**
|
|
49
|
+
- Look for "Official Image" or "Verified Publisher" badges
|
|
50
|
+
- Official images are maintained and regularly updated
|
|
51
|
+
|
|
52
|
+
### RUN
|
|
53
|
+
|
|
54
|
+
**Chain commands to reduce layers**
|
|
55
|
+
```dockerfile
|
|
56
|
+
# Bad - creates 4 layers
|
|
57
|
+
RUN apt-get update
|
|
58
|
+
RUN apt-get install -y curl
|
|
59
|
+
RUN apt-get install -y vim
|
|
60
|
+
RUN curl -sL https://example.com/script.sh | bash
|
|
61
|
+
|
|
62
|
+
# Good - creates 1 layer
|
|
63
|
+
RUN apt-get update && apt-get install -y --no-install-recommends \
|
|
64
|
+
curl \
|
|
65
|
+
vim \
|
|
66
|
+
&& rm -rf /var/lib/apt/lists/* \
|
|
67
|
+
&& curl -sL https://example.com/script.sh | bash
|
|
68
|
+
```
|
|
69
|
+
|
|
70
|
+
**Clean up in same layer**
|
|
71
|
+
```dockerfile
|
|
72
|
+
# Package manager cache must be removed in same RUN
|
|
73
|
+
RUN apt-get update && apt-get install -y \
|
|
74
|
+
package1 \
|
|
75
|
+
package2 \
|
|
76
|
+
&& rm -rf /var/lib/apt/lists/*
|
|
77
|
+
|
|
78
|
+
# For Alpine
|
|
79
|
+
RUN apk add --no-cache package1 package2
|
|
80
|
+
```
|
|
81
|
+
|
|
82
|
+
**Use --no-install-recommends for apt**
|
|
83
|
+
```dockerfile
|
|
84
|
+
RUN apt-get install -y --no-install-recommends package
|
|
85
|
+
```
|
|
86
|
+
|
|
87
|
+
**Pin package versions**
|
|
88
|
+
```dockerfile
|
|
89
|
+
# For apt
|
|
90
|
+
RUN apt-get install -y package=1.2.3-1
|
|
91
|
+
|
|
92
|
+
# For apk
|
|
93
|
+
RUN apk add package=1.2.3-r0
|
|
94
|
+
|
|
95
|
+
# For pip
|
|
96
|
+
RUN pip install package==1.2.3
|
|
97
|
+
```
|
|
98
|
+
|
|
99
|
+
**Sort multi-line arguments**
|
|
100
|
+
```dockerfile
|
|
101
|
+
RUN apt-get update && apt-get install -y \
|
|
102
|
+
curl \
|
|
103
|
+
git \
|
|
104
|
+
vim \
|
|
105
|
+
wget \
|
|
106
|
+
&& rm -rf /var/lib/apt/lists/*
|
|
107
|
+
```
|
|
108
|
+
|
|
109
|
+
**Use pipefail for pipes**
|
|
110
|
+
```dockerfile
|
|
111
|
+
RUN set -o pipefail && wget -O - https://example.com | wc -l > /number
|
|
112
|
+
```
|
|
113
|
+
|
|
114
|
+
### COPY vs ADD
|
|
115
|
+
|
|
116
|
+
**Prefer COPY over ADD**
|
|
117
|
+
```dockerfile
|
|
118
|
+
# Use COPY for files and directories
|
|
119
|
+
COPY app.py /app/
|
|
120
|
+
|
|
121
|
+
# Only use ADD for auto-extraction or remote URLs
|
|
122
|
+
ADD https://example.com/file.tar.gz /tmp/
|
|
123
|
+
```
|
|
124
|
+
|
|
125
|
+
**Use COPY --chown to avoid extra layer**
|
|
126
|
+
```dockerfile
|
|
127
|
+
# Bad - creates extra layer
|
|
128
|
+
COPY app.py /app/
|
|
129
|
+
RUN chown user:user /app/app.py
|
|
130
|
+
|
|
131
|
+
# Good - single layer
|
|
132
|
+
COPY --chown=user:user app.py /app/
|
|
133
|
+
```
|
|
134
|
+
|
|
135
|
+
### WORKDIR
|
|
136
|
+
|
|
137
|
+
**Use absolute paths**
|
|
138
|
+
```dockerfile
|
|
139
|
+
# Bad
|
|
140
|
+
WORKDIR app
|
|
141
|
+
|
|
142
|
+
# Good
|
|
143
|
+
WORKDIR /app
|
|
144
|
+
```
|
|
145
|
+
|
|
146
|
+
**Don't use RUN cd**
|
|
147
|
+
```dockerfile
|
|
148
|
+
# Bad
|
|
149
|
+
RUN cd /app && npm install
|
|
150
|
+
|
|
151
|
+
# Good
|
|
152
|
+
WORKDIR /app
|
|
153
|
+
RUN npm install
|
|
154
|
+
```
|
|
155
|
+
|
|
156
|
+
### USER
|
|
157
|
+
|
|
158
|
+
**Don't run as root**
|
|
159
|
+
```dockerfile
|
|
160
|
+
# Create user
|
|
161
|
+
RUN groupadd -r app && useradd -r -g app app
|
|
162
|
+
|
|
163
|
+
# Or for Alpine
|
|
164
|
+
RUN addgroup -g 1001 -S app && adduser -S app -u 1001
|
|
165
|
+
|
|
166
|
+
# Switch to user
|
|
167
|
+
USER app
|
|
168
|
+
```
|
|
169
|
+
|
|
170
|
+
**Use high UID (>10000) for better security**
|
|
171
|
+
```dockerfile
|
|
172
|
+
RUN useradd -u 10001 -m app
|
|
173
|
+
USER app
|
|
174
|
+
```
|
|
175
|
+
|
|
176
|
+
### CMD and ENTRYPOINT
|
|
177
|
+
|
|
178
|
+
**Use exec form for proper signal handling**
|
|
179
|
+
```dockerfile
|
|
180
|
+
# Bad - shell form (doesn't handle signals)
|
|
181
|
+
CMD python app.py
|
|
182
|
+
|
|
183
|
+
# Good - exec form
|
|
184
|
+
CMD ["python", "app.py"]
|
|
185
|
+
```
|
|
186
|
+
|
|
187
|
+
**Combine ENTRYPOINT and CMD**
|
|
188
|
+
```dockerfile
|
|
189
|
+
# ENTRYPOINT defines the executable
|
|
190
|
+
ENTRYPOINT ["python"]
|
|
191
|
+
|
|
192
|
+
# CMD provides default arguments (can be overridden)
|
|
193
|
+
CMD ["app.py"]
|
|
194
|
+
```
|
|
195
|
+
|
|
196
|
+
### EXPOSE
|
|
197
|
+
|
|
198
|
+
**Document ports even though it doesn't publish**
|
|
199
|
+
```dockerfile
|
|
200
|
+
EXPOSE 8080
|
|
201
|
+
EXPOSE 443
|
|
202
|
+
```
|
|
203
|
+
|
|
204
|
+
### HEALTHCHECK
|
|
205
|
+
|
|
206
|
+
**Add health checks for services**
|
|
207
|
+
```dockerfile
|
|
208
|
+
HEALTHCHECK --interval=30s --timeout=3s --start-period=5s --retries=3 \
|
|
209
|
+
CMD curl -f http://localhost:8080/health || exit 1
|
|
210
|
+
```
|
|
211
|
+
|
|
212
|
+
### LABEL
|
|
213
|
+
|
|
214
|
+
**Add metadata**
|
|
215
|
+
```dockerfile
|
|
216
|
+
LABEL org.opencontainers.image.authors="team@example.com"
|
|
217
|
+
LABEL org.opencontainers.image.version="1.0.0"
|
|
218
|
+
LABEL org.opencontainers.image.description="Application description"
|
|
219
|
+
```
|
|
220
|
+
|
|
221
|
+
## Build Optimization
|
|
222
|
+
|
|
223
|
+
### Layer Caching
|
|
224
|
+
|
|
225
|
+
**Order instructions from least to most frequently changing**
|
|
226
|
+
```dockerfile
|
|
227
|
+
# 1. Base image (rarely changes)
|
|
228
|
+
FROM node:21-alpine
|
|
229
|
+
|
|
230
|
+
# 2. System packages (rarely change)
|
|
231
|
+
RUN apk add --no-cache curl
|
|
232
|
+
|
|
233
|
+
# 3. Dependencies (change occasionally)
|
|
234
|
+
COPY package*.json ./
|
|
235
|
+
RUN npm ci
|
|
236
|
+
|
|
237
|
+
# 4. Source code (changes frequently)
|
|
238
|
+
COPY . .
|
|
239
|
+
```
|
|
240
|
+
|
|
241
|
+
### Multi-Stage Builds
|
|
242
|
+
|
|
243
|
+
**Separate build and runtime**
|
|
244
|
+
```dockerfile
|
|
245
|
+
# Build stage
|
|
246
|
+
FROM node:21 AS builder
|
|
247
|
+
WORKDIR /app
|
|
248
|
+
COPY package*.json ./
|
|
249
|
+
RUN npm install
|
|
250
|
+
COPY . .
|
|
251
|
+
RUN npm run build
|
|
252
|
+
|
|
253
|
+
# Runtime stage
|
|
254
|
+
FROM node:21-alpine
|
|
255
|
+
COPY --from=builder /app/dist /app
|
|
256
|
+
CMD ["node", "/app/index.js"]
|
|
257
|
+
```
|
|
258
|
+
|
|
259
|
+
### BuildKit Features
|
|
260
|
+
|
|
261
|
+
**Enable modern features**
|
|
262
|
+
```dockerfile
|
|
263
|
+
# syntax=docker/dockerfile:1
|
|
264
|
+
|
|
265
|
+
# Use cache mounts
|
|
266
|
+
RUN --mount=type=cache,target=/root/.cache/pip \
|
|
267
|
+
pip install -r requirements.txt
|
|
268
|
+
|
|
269
|
+
# Use secret mounts (secrets not in final image)
|
|
270
|
+
RUN --mount=type=secret,id=aws,target=/root/.aws/credentials \
|
|
271
|
+
aws s3 cp s3://bucket/file .
|
|
272
|
+
```
|
|
273
|
+
|
|
274
|
+
## Security Best Practices
|
|
275
|
+
|
|
276
|
+
### 1. Scan Images
|
|
277
|
+
```bash
|
|
278
|
+
docker scan myimage:tag
|
|
279
|
+
# or
|
|
280
|
+
trivy image myimage:tag
|
|
281
|
+
```
|
|
282
|
+
|
|
283
|
+
### 2. Use Minimal Base Images
|
|
284
|
+
- Fewer packages = fewer vulnerabilities
|
|
285
|
+
- Alpine, distroless, or scratch
|
|
286
|
+
|
|
287
|
+
### 3. Don't Store Secrets in Images
|
|
288
|
+
```dockerfile
|
|
289
|
+
# Bad
|
|
290
|
+
ENV DATABASE_PASSWORD=secret123
|
|
291
|
+
|
|
292
|
+
# Good - use runtime config or secrets
|
|
293
|
+
# Pass at runtime: docker run -e DATABASE_PASSWORD=...
|
|
294
|
+
```
|
|
295
|
+
|
|
296
|
+
### 4. Run as Non-Root
|
|
297
|
+
```dockerfile
|
|
298
|
+
USER app
|
|
299
|
+
```
|
|
300
|
+
|
|
301
|
+
### 5. Use Read-Only Filesystem
|
|
302
|
+
```bash
|
|
303
|
+
docker run --read-only myimage
|
|
304
|
+
```
|
|
305
|
+
|
|
306
|
+
### 6. Limit Capabilities
|
|
307
|
+
```bash
|
|
308
|
+
docker run --cap-drop=ALL --cap-add=NET_BIND_SERVICE myimage
|
|
309
|
+
```
|
|
310
|
+
|
|
311
|
+
## Common Anti-Patterns
|
|
312
|
+
|
|
313
|
+
### ❌ Using :latest tag
|
|
314
|
+
- Unpredictable
|
|
315
|
+
- Not reproducible
|
|
316
|
+
- Can break without warning
|
|
317
|
+
|
|
318
|
+
### ❌ Not cleaning package cache
|
|
319
|
+
```dockerfile
|
|
320
|
+
# Missing cleanup increases image by hundreds of MB
|
|
321
|
+
RUN apt-get update && apt-get install -y package
|
|
322
|
+
# Missing: && rm -rf /var/lib/apt/lists/*
|
|
323
|
+
```
|
|
324
|
+
|
|
325
|
+
### ❌ Running as root
|
|
326
|
+
- Security risk
|
|
327
|
+
- Violates principle of least privilege
|
|
328
|
+
|
|
329
|
+
### ❌ Installing unnecessary packages
|
|
330
|
+
```dockerfile
|
|
331
|
+
# Bloated image
|
|
332
|
+
RUN apt-get install -y vim nano emacs curl wget
|
|
333
|
+
```
|
|
334
|
+
|
|
335
|
+
### ❌ Using ADD instead of COPY
|
|
336
|
+
- ADD has implicit behavior
|
|
337
|
+
- Can extract archives unexpectedly
|
|
338
|
+
|
|
339
|
+
### ❌ Multiple FROM in non-multi-stage context
|
|
340
|
+
- Creates confusion
|
|
341
|
+
- Use multi-stage builds properly
|
|
342
|
+
|
|
343
|
+
## Resources
|
|
344
|
+
|
|
345
|
+
- [Official Docker Best Practices](https://docs.docker.com/build/building/best-practices/)
|
|
346
|
+
- [Dockerfile Reference](https://docs.docker.com/reference/dockerfile/)
|
|
347
|
+
- [Docker Security Best Practices](https://docs.docker.com/develop/security-best-practices/)
|
|
348
|
+
- [Multi-Stage Builds](https://docs.docker.com/build/building/multi-stage/)
|