@hybridlabor-api/aos 4.8.0 → 4.10.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 → AGENTS.md} +3 -1
- package/.agents/nodes.json +3 -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/hooks/memb-inject.mjs +29 -1
- package/.claude/settings.json +13 -0
- package/.claude/workflows/startcycle-dispatch.mjs +23 -1
- package/.opencode/agents/godmode-media-eventtech.md +1 -1
- package/.opencode/plugins/bdb-aos.js +31 -4
- package/CLAUDE.md +0 -571
- package/README.de.md +1 -1
- package/README.md +1 -1
- package/README.pt.md +1 -1
- package/THIRD_PARTY_NOTICES.md +126 -0
- package/bin/aos-doctor.mjs +1 -1
- package/docs/skills_table.md +1 -1
- package/installer.js +187 -55
- package/package.json +7 -3
- 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/basic/bdb-eventagency-skill/SKILL.md +252 -0
- package/skills/basic/bdb-shipping-skill/SKILL.md +161 -0
- package/skills/basic/godmode-eventtech/SKILL.md +4 -1
- package/skills/global_config/agenttrail/SKILL.md +6 -1
- package/skills/global_config/aos-project-init/SKILL.md +2 -0
- package/skills/global_config/aos-project-init/assets/AGENTS.template.md +1 -1
- package/skills/global_config/aos-project-init/scripts/aos-project-doctor.mjs +1 -1
- package/skills/global_config/aos-setup/SKILL.md +1 -1
- package/skills/global_config/aos-setup/scripts/aos-doctor.mjs +1 -1
- package/skills/global_config/ask-tim/SKILL.md +7 -7
- 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/deja-memory/SKILL.md +3 -1
- 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/plan-canvas/SKILL.md +9 -2
- package/skills/global_config/plan-canvas/scripts/lib/plan-canvas/ui.js +10 -2
- package/skills/global_config/plan-canvas/scripts/plan-canvas.js +1 -1
- package/skills/global_config/read-the-damn-docs/SKILL.md +175 -0
- 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 +152 -0
- package/.claude/CLAUDE.md +0 -12
- package/mcps/RhinoMCP/docs/content/docs/getting-started/gemini.md +0 -61
- /package/{GEMINI.md → RULES.md} +0 -0
|
@@ -0,0 +1,510 @@
|
|
|
1
|
+
# Language-Specific Dockerfile Guides
|
|
2
|
+
|
|
3
|
+
## Overview
|
|
4
|
+
|
|
5
|
+
This guide provides best practices and optimized Dockerfile templates for popular programming languages and frameworks.
|
|
6
|
+
|
|
7
|
+
## Node.js
|
|
8
|
+
|
|
9
|
+
### Basic Node.js Application
|
|
10
|
+
|
|
11
|
+
```dockerfile
|
|
12
|
+
# syntax=docker/dockerfile:1
|
|
13
|
+
FROM node:20-alpine AS base
|
|
14
|
+
WORKDIR /app
|
|
15
|
+
|
|
16
|
+
# Dependencies stage
|
|
17
|
+
FROM base AS deps
|
|
18
|
+
COPY package.json package-lock.json ./
|
|
19
|
+
RUN npm ci --only=production && npm cache clean --force
|
|
20
|
+
|
|
21
|
+
# Production stage
|
|
22
|
+
FROM base AS production
|
|
23
|
+
COPY --from=deps /app/node_modules ./node_modules
|
|
24
|
+
COPY . .
|
|
25
|
+
RUN addgroup -g 1001 -S nodejs && adduser -S nodejs -u 1001
|
|
26
|
+
USER nodejs
|
|
27
|
+
EXPOSE 3000
|
|
28
|
+
HEALTHCHECK CMD node -e "require('http').get('http://localhost:3000/health',(r)=>{process.exit(r.statusCode===200?0:1)})"
|
|
29
|
+
CMD ["node", "server.js"]
|
|
30
|
+
```
|
|
31
|
+
|
|
32
|
+
### Next.js Application
|
|
33
|
+
|
|
34
|
+
```dockerfile
|
|
35
|
+
# syntax=docker/dockerfile:1
|
|
36
|
+
FROM node:20-alpine AS deps
|
|
37
|
+
WORKDIR /app
|
|
38
|
+
COPY package.json package-lock.json ./
|
|
39
|
+
RUN npm ci
|
|
40
|
+
|
|
41
|
+
FROM node:20-alpine AS builder
|
|
42
|
+
WORKDIR /app
|
|
43
|
+
COPY --from=deps /app/node_modules ./node_modules
|
|
44
|
+
COPY . .
|
|
45
|
+
ENV NEXT_TELEMETRY_DISABLED=1
|
|
46
|
+
RUN npm run build
|
|
47
|
+
|
|
48
|
+
FROM node:20-alpine AS runner
|
|
49
|
+
WORKDIR /app
|
|
50
|
+
ENV NODE_ENV=production
|
|
51
|
+
ENV NEXT_TELEMETRY_DISABLED=1
|
|
52
|
+
RUN addgroup --system --gid 1001 nodejs && \
|
|
53
|
+
adduser --system --uid 1001 nextjs
|
|
54
|
+
COPY --from=builder --chown=nextjs:nodejs /app/.next ./.next
|
|
55
|
+
COPY --from=builder --chown=nextjs:nodejs /app/public ./public
|
|
56
|
+
COPY --from=builder /app/node_modules ./node_modules
|
|
57
|
+
COPY --from=builder /app/package.json ./package.json
|
|
58
|
+
USER nextjs
|
|
59
|
+
EXPOSE 3000
|
|
60
|
+
CMD ["npm", "start"]
|
|
61
|
+
```
|
|
62
|
+
|
|
63
|
+
### Express.js API
|
|
64
|
+
|
|
65
|
+
```dockerfile
|
|
66
|
+
# syntax=docker/dockerfile:1
|
|
67
|
+
FROM node:20-alpine
|
|
68
|
+
WORKDIR /app
|
|
69
|
+
COPY package*.json ./
|
|
70
|
+
RUN npm ci --only=production && npm cache clean --force
|
|
71
|
+
COPY . .
|
|
72
|
+
RUN addgroup -g 1001 -S appgroup && adduser -S app -u 1001 -G appgroup && \
|
|
73
|
+
chown -R app:appgroup /app
|
|
74
|
+
USER app
|
|
75
|
+
EXPOSE 3000
|
|
76
|
+
HEALTHCHECK --interval=30s --timeout=3s CMD node -e "require('http').get('http://localhost:3000/health',(r)=>{process.exit(r.statusCode===200?0:1)})"
|
|
77
|
+
CMD ["node", "server.js"]
|
|
78
|
+
```
|
|
79
|
+
|
|
80
|
+
**Best Practices:**
|
|
81
|
+
- Use `npm ci` instead of `npm install` for deterministic builds
|
|
82
|
+
- Always use `package-lock.json` for version locking
|
|
83
|
+
- Run `npm cache clean --force` after install
|
|
84
|
+
- Use `--only=production` to exclude dev dependencies
|
|
85
|
+
- Set `NODE_ENV=production`
|
|
86
|
+
|
|
87
|
+
## Python
|
|
88
|
+
|
|
89
|
+
### Basic Python Application
|
|
90
|
+
|
|
91
|
+
```dockerfile
|
|
92
|
+
# syntax=docker/dockerfile:1
|
|
93
|
+
FROM python:3.12-slim AS builder
|
|
94
|
+
WORKDIR /app
|
|
95
|
+
# hadolint ignore=DL3008
|
|
96
|
+
RUN apt-get update && apt-get install -y --no-install-recommends gcc && \
|
|
97
|
+
rm -rf /var/lib/apt/lists/*
|
|
98
|
+
COPY requirements.txt .
|
|
99
|
+
RUN pip install --no-cache-dir --user -r requirements.txt
|
|
100
|
+
|
|
101
|
+
FROM python:3.12-slim
|
|
102
|
+
WORKDIR /app
|
|
103
|
+
RUN useradd -m -u 1001 app
|
|
104
|
+
COPY --from=builder /root/.local /home/app/.local
|
|
105
|
+
COPY --chown=app:app . .
|
|
106
|
+
ENV PATH=/home/app/.local/bin:$PATH \
|
|
107
|
+
PYTHONUNBUFFERED=1 \
|
|
108
|
+
PYTHONDONTWRITEBYTECODE=1
|
|
109
|
+
USER app
|
|
110
|
+
EXPOSE 8000
|
|
111
|
+
CMD ["python", "app.py"]
|
|
112
|
+
```
|
|
113
|
+
|
|
114
|
+
### FastAPI Application
|
|
115
|
+
|
|
116
|
+
```dockerfile
|
|
117
|
+
# syntax=docker/dockerfile:1
|
|
118
|
+
FROM python:3.12-slim AS builder
|
|
119
|
+
WORKDIR /app
|
|
120
|
+
# hadolint ignore=DL3008
|
|
121
|
+
RUN apt-get update && apt-get install -y --no-install-recommends gcc && \
|
|
122
|
+
rm -rf /var/lib/apt/lists/*
|
|
123
|
+
COPY requirements.txt .
|
|
124
|
+
RUN pip install --no-cache-dir --user -r requirements.txt
|
|
125
|
+
|
|
126
|
+
FROM python:3.12-slim
|
|
127
|
+
WORKDIR /app
|
|
128
|
+
RUN useradd -m -u 1001 app
|
|
129
|
+
COPY --from=builder /root/.local /home/app/.local
|
|
130
|
+
COPY --chown=app:app . .
|
|
131
|
+
ENV PATH=/home/app/.local/bin:$PATH \
|
|
132
|
+
PYTHONUNBUFFERED=1 \
|
|
133
|
+
PYTHONDONTWRITEBYTECODE=1
|
|
134
|
+
USER app
|
|
135
|
+
EXPOSE 8000
|
|
136
|
+
HEALTHCHECK CMD python -c "import urllib.request;urllib.request.urlopen('http://localhost:8000/health')" || exit 1
|
|
137
|
+
CMD ["uvicorn", "main:app", "--host", "0.0.0.0", "--port", "8000"]
|
|
138
|
+
```
|
|
139
|
+
|
|
140
|
+
### Django Application
|
|
141
|
+
|
|
142
|
+
```dockerfile
|
|
143
|
+
# syntax=docker/dockerfile:1
|
|
144
|
+
FROM python:3.12-slim AS builder
|
|
145
|
+
WORKDIR /app
|
|
146
|
+
# hadolint ignore=DL3008
|
|
147
|
+
RUN apt-get update && apt-get install -y --no-install-recommends \
|
|
148
|
+
gcc postgresql-client libpq-dev && \
|
|
149
|
+
rm -rf /var/lib/apt/lists/*
|
|
150
|
+
COPY requirements.txt .
|
|
151
|
+
RUN pip wheel --no-cache-dir --no-deps --wheel-dir /wheels -r requirements.txt
|
|
152
|
+
|
|
153
|
+
FROM python:3.12-slim
|
|
154
|
+
WORKDIR /app
|
|
155
|
+
# hadolint ignore=DL3008
|
|
156
|
+
RUN apt-get update && apt-get install -y --no-install-recommends \
|
|
157
|
+
postgresql-client libpq-dev && \
|
|
158
|
+
rm -rf /var/lib/apt/lists/*
|
|
159
|
+
COPY --from=builder /wheels /wheels
|
|
160
|
+
RUN pip install --no-cache /wheels/* && rm -rf /wheels
|
|
161
|
+
RUN useradd -m -u 1001 app
|
|
162
|
+
COPY --chown=app:app . .
|
|
163
|
+
RUN python manage.py collectstatic --noinput
|
|
164
|
+
ENV PYTHONUNBUFFERED=1 \
|
|
165
|
+
PYTHONDONTWRITEBYTECODE=1
|
|
166
|
+
USER app
|
|
167
|
+
EXPOSE 8000
|
|
168
|
+
CMD ["gunicorn", "--bind", "0.0.0.0:8000", "project.wsgi:application"]
|
|
169
|
+
```
|
|
170
|
+
|
|
171
|
+
**Best Practices:**
|
|
172
|
+
- Use `pip install --no-cache-dir` to reduce image size
|
|
173
|
+
- Install build dependencies in builder stage only
|
|
174
|
+
- Use wheels for compiled dependencies
|
|
175
|
+
- Set `PYTHONUNBUFFERED=1` for real-time container logs (stdout/stderr flushed immediately)
|
|
176
|
+
- Set `PYTHONDONTWRITEBYTECODE=1` to skip `.pyc` files in the image
|
|
177
|
+
- Use `--user` flag for pip install (non-root)
|
|
178
|
+
|
|
179
|
+
## Go
|
|
180
|
+
|
|
181
|
+
### Basic Go Application
|
|
182
|
+
|
|
183
|
+
```dockerfile
|
|
184
|
+
# syntax=docker/dockerfile:1
|
|
185
|
+
FROM golang:1.21-alpine AS builder
|
|
186
|
+
WORKDIR /app
|
|
187
|
+
COPY go.mod go.sum ./
|
|
188
|
+
RUN go mod download
|
|
189
|
+
COPY . .
|
|
190
|
+
RUN CGO_ENABLED=0 GOOS=linux go build -a -ldflags="-s -w" -o main .
|
|
191
|
+
|
|
192
|
+
FROM alpine:3.21
|
|
193
|
+
RUN apk --no-cache add ca-certificates
|
|
194
|
+
WORKDIR /app
|
|
195
|
+
RUN addgroup -g 1001 -S appgroup && adduser -S app -u 1001 -G appgroup
|
|
196
|
+
COPY --from=builder /app/main .
|
|
197
|
+
USER app
|
|
198
|
+
EXPOSE 8080
|
|
199
|
+
HEALTHCHECK CMD wget --no-verbose --tries=1 --spider http://localhost:8080/health || exit 1
|
|
200
|
+
CMD ["./main"]
|
|
201
|
+
```
|
|
202
|
+
|
|
203
|
+
### Go with Distroless (Minimal)
|
|
204
|
+
|
|
205
|
+
```dockerfile
|
|
206
|
+
# syntax=docker/dockerfile:1
|
|
207
|
+
FROM golang:1.21-alpine AS builder
|
|
208
|
+
WORKDIR /app
|
|
209
|
+
COPY go.mod go.sum ./
|
|
210
|
+
RUN go mod download
|
|
211
|
+
COPY . .
|
|
212
|
+
RUN CGO_ENABLED=0 GOOS=linux go build -a -ldflags="-s -w" -o /main .
|
|
213
|
+
|
|
214
|
+
# gcr.io/distroless/static-debian12 IS a specific tag; hadolint DL3006 is a
|
|
215
|
+
# false positive for non-Docker-Hub registries.
|
|
216
|
+
# hadolint ignore=DL3006
|
|
217
|
+
FROM gcr.io/distroless/static-debian12
|
|
218
|
+
COPY --from=builder /main /main
|
|
219
|
+
USER nonroot:nonroot
|
|
220
|
+
EXPOSE 8080
|
|
221
|
+
ENTRYPOINT ["/main"]
|
|
222
|
+
```
|
|
223
|
+
|
|
224
|
+
### Go with Scratch (Absolute Minimal)
|
|
225
|
+
|
|
226
|
+
```dockerfile
|
|
227
|
+
# syntax=docker/dockerfile:1
|
|
228
|
+
FROM golang:1.21-alpine AS builder
|
|
229
|
+
WORKDIR /app
|
|
230
|
+
COPY go.mod go.sum ./
|
|
231
|
+
RUN go mod download
|
|
232
|
+
COPY . .
|
|
233
|
+
RUN CGO_ENABLED=0 GOOS=linux go build -a -ldflags="-s -w" -o /main .
|
|
234
|
+
|
|
235
|
+
FROM scratch
|
|
236
|
+
COPY --from=builder /main /main
|
|
237
|
+
COPY --from=builder /etc/ssl/certs/ca-certificates.crt /etc/ssl/certs/
|
|
238
|
+
USER 1001:1001
|
|
239
|
+
ENTRYPOINT ["/main"]
|
|
240
|
+
```
|
|
241
|
+
|
|
242
|
+
**Best Practices:**
|
|
243
|
+
- Use `CGO_ENABLED=0` for static binaries
|
|
244
|
+
- Use `-ldflags="-s -w"` to strip debug symbols
|
|
245
|
+
- Use scratch or distroless for minimal images
|
|
246
|
+
- Include ca-certificates if making HTTPS requests
|
|
247
|
+
- Use go modules (go.mod) for dependency management
|
|
248
|
+
|
|
249
|
+
## Java
|
|
250
|
+
|
|
251
|
+
### Spring Boot with Maven
|
|
252
|
+
|
|
253
|
+
```dockerfile
|
|
254
|
+
# syntax=docker/dockerfile:1
|
|
255
|
+
FROM eclipse-temurin:21-jdk-jammy AS builder
|
|
256
|
+
WORKDIR /app
|
|
257
|
+
COPY mvnw pom.xml ./
|
|
258
|
+
COPY .mvn .mvn
|
|
259
|
+
RUN ./mvnw dependency:go-offline
|
|
260
|
+
COPY src ./src
|
|
261
|
+
RUN ./mvnw clean package -DskipTests && mv target/*.jar target/app.jar
|
|
262
|
+
|
|
263
|
+
FROM eclipse-temurin:21-jre-jammy
|
|
264
|
+
WORKDIR /app
|
|
265
|
+
RUN useradd -m -u 1001 app
|
|
266
|
+
COPY --from=builder --chown=app:app /app/target/app.jar ./app.jar
|
|
267
|
+
USER app
|
|
268
|
+
EXPOSE 8080
|
|
269
|
+
HEALTHCHECK CMD curl -f http://localhost:8080/actuator/health || exit 1
|
|
270
|
+
ENTRYPOINT ["java", "-jar", "app.jar"]
|
|
271
|
+
```
|
|
272
|
+
|
|
273
|
+
### Spring Boot with Gradle
|
|
274
|
+
|
|
275
|
+
```dockerfile
|
|
276
|
+
# syntax=docker/dockerfile:1
|
|
277
|
+
FROM eclipse-temurin:21-jdk-jammy AS builder
|
|
278
|
+
WORKDIR /app
|
|
279
|
+
COPY gradlew ./
|
|
280
|
+
COPY gradle gradle
|
|
281
|
+
COPY build.gradle settings.gradle ./
|
|
282
|
+
RUN ./gradlew dependencies --no-daemon
|
|
283
|
+
COPY src ./src
|
|
284
|
+
RUN ./gradlew build -x test --no-daemon && \
|
|
285
|
+
mv build/libs/*.jar build/libs/app.jar
|
|
286
|
+
|
|
287
|
+
FROM eclipse-temurin:21-jre-jammy
|
|
288
|
+
WORKDIR /app
|
|
289
|
+
RUN useradd -m -u 1001 app
|
|
290
|
+
COPY --from=builder --chown=app:app /app/build/libs/app.jar ./app.jar
|
|
291
|
+
USER app
|
|
292
|
+
EXPOSE 8080
|
|
293
|
+
HEALTHCHECK CMD curl -f http://localhost:8080/actuator/health || exit 1
|
|
294
|
+
ENTRYPOINT ["java", "-jar", "app.jar"]
|
|
295
|
+
```
|
|
296
|
+
|
|
297
|
+
### Spring Boot Layered (Optimized)
|
|
298
|
+
|
|
299
|
+
```dockerfile
|
|
300
|
+
# syntax=docker/dockerfile:1
|
|
301
|
+
FROM eclipse-temurin:21-jdk-jammy AS builder
|
|
302
|
+
WORKDIR /app
|
|
303
|
+
COPY mvnw pom.xml ./
|
|
304
|
+
COPY .mvn .mvn
|
|
305
|
+
RUN ./mvnw dependency:go-offline
|
|
306
|
+
COPY src ./src
|
|
307
|
+
RUN ./mvnw clean package -DskipTests
|
|
308
|
+
RUN java -Djarmode=layertools -jar target/*.jar extract --destination target/extracted
|
|
309
|
+
|
|
310
|
+
FROM eclipse-temurin:21-jre-jammy
|
|
311
|
+
WORKDIR /app
|
|
312
|
+
RUN useradd -m -u 1001 app
|
|
313
|
+
USER app
|
|
314
|
+
COPY --from=builder /app/target/extracted/dependencies/ ./
|
|
315
|
+
COPY --from=builder /app/target/extracted/spring-boot-loader/ ./
|
|
316
|
+
COPY --from=builder /app/target/extracted/snapshot-dependencies/ ./
|
|
317
|
+
COPY --from=builder /app/target/extracted/application/ ./
|
|
318
|
+
EXPOSE 8080
|
|
319
|
+
HEALTHCHECK CMD curl -f http://localhost:8080/actuator/health || exit 1
|
|
320
|
+
ENTRYPOINT ["java", "org.springframework.boot.loader.launch.JarLauncher"]
|
|
321
|
+
```
|
|
322
|
+
|
|
323
|
+
**Best Practices:**
|
|
324
|
+
- Use JRE instead of JDK for runtime (smaller)
|
|
325
|
+
- Use layered JARs for better caching
|
|
326
|
+
- Run `./mvnw dependency:go-offline` to cache dependencies
|
|
327
|
+
- Use `--no-daemon` with Gradle to avoid background processes
|
|
328
|
+
- Set appropriate Java heap size with `-Xmx` and `-Xms`
|
|
329
|
+
|
|
330
|
+
## Rust
|
|
331
|
+
|
|
332
|
+
### Rust Application
|
|
333
|
+
|
|
334
|
+
```dockerfile
|
|
335
|
+
# syntax=docker/dockerfile:1
|
|
336
|
+
FROM rust:1.75-alpine AS builder
|
|
337
|
+
WORKDIR /app
|
|
338
|
+
RUN apk add --no-cache musl-dev
|
|
339
|
+
COPY Cargo.toml Cargo.lock ./
|
|
340
|
+
# Cache dependencies
|
|
341
|
+
RUN mkdir src && echo "fn main() {}" > src/main.rs && \
|
|
342
|
+
cargo build --release && \
|
|
343
|
+
rm -rf src
|
|
344
|
+
COPY src ./src
|
|
345
|
+
RUN touch src/main.rs && cargo build --release
|
|
346
|
+
|
|
347
|
+
FROM alpine:3.21
|
|
348
|
+
RUN apk --no-cache add ca-certificates
|
|
349
|
+
WORKDIR /app
|
|
350
|
+
RUN addgroup -g 1001 -S appgroup && adduser -S app -u 1001 -G appgroup
|
|
351
|
+
COPY --from=builder /app/target/release/app ./
|
|
352
|
+
USER app
|
|
353
|
+
EXPOSE 8080
|
|
354
|
+
CMD ["./app"]
|
|
355
|
+
```
|
|
356
|
+
|
|
357
|
+
## Ruby
|
|
358
|
+
|
|
359
|
+
### Ruby on Rails
|
|
360
|
+
|
|
361
|
+
```dockerfile
|
|
362
|
+
# syntax=docker/dockerfile:1
|
|
363
|
+
FROM ruby:3.3-alpine AS builder
|
|
364
|
+
WORKDIR /app
|
|
365
|
+
RUN apk add --no-cache build-base postgresql-dev nodejs yarn
|
|
366
|
+
COPY Gemfile Gemfile.lock ./
|
|
367
|
+
RUN bundle install --without development test
|
|
368
|
+
COPY package.json yarn.lock ./
|
|
369
|
+
RUN yarn install --production
|
|
370
|
+
COPY . .
|
|
371
|
+
RUN bundle exec rake assets:precompile
|
|
372
|
+
|
|
373
|
+
FROM ruby:3.3-alpine
|
|
374
|
+
WORKDIR /app
|
|
375
|
+
RUN apk add --no-cache postgresql-client nodejs
|
|
376
|
+
RUN addgroup -g 1001 -S appgroup && adduser -S app -u 1001 -G appgroup
|
|
377
|
+
COPY --from=builder /usr/local/bundle /usr/local/bundle
|
|
378
|
+
COPY --from=builder --chown=app:appgroup /app ./
|
|
379
|
+
USER app
|
|
380
|
+
EXPOSE 3000
|
|
381
|
+
CMD ["bundle", "exec", "rails", "server", "-b", "0.0.0.0"]
|
|
382
|
+
```
|
|
383
|
+
|
|
384
|
+
## PHP
|
|
385
|
+
|
|
386
|
+
### PHP with Laravel
|
|
387
|
+
|
|
388
|
+
```dockerfile
|
|
389
|
+
# syntax=docker/dockerfile:1
|
|
390
|
+
FROM composer:2 AS composer
|
|
391
|
+
WORKDIR /app
|
|
392
|
+
COPY composer.json composer.lock ./
|
|
393
|
+
RUN composer install --no-dev --no-scripts --no-autoloader --prefer-dist
|
|
394
|
+
|
|
395
|
+
FROM php:8.3-fpm-alpine
|
|
396
|
+
WORKDIR /app
|
|
397
|
+
RUN apk add --no-cache postgresql-dev && \
|
|
398
|
+
docker-php-ext-install pdo pdo_pgsql
|
|
399
|
+
COPY --from=composer /app/vendor ./vendor
|
|
400
|
+
COPY . .
|
|
401
|
+
RUN composer dump-autoload --optimize --classmap-authoritative
|
|
402
|
+
RUN addgroup -g 1001 -S appgroup && adduser -S app -u 1001 -G appgroup && \
|
|
403
|
+
chown -R app:appgroup /app
|
|
404
|
+
USER app
|
|
405
|
+
EXPOSE 9000
|
|
406
|
+
CMD ["php-fpm"]
|
|
407
|
+
```
|
|
408
|
+
|
|
409
|
+
## .NET
|
|
410
|
+
|
|
411
|
+
### ASP.NET Core
|
|
412
|
+
|
|
413
|
+
```dockerfile
|
|
414
|
+
# syntax=docker/dockerfile:1
|
|
415
|
+
FROM mcr.microsoft.com/dotnet/sdk:8.0 AS builder
|
|
416
|
+
WORKDIR /app
|
|
417
|
+
COPY *.csproj ./
|
|
418
|
+
RUN dotnet restore
|
|
419
|
+
COPY . .
|
|
420
|
+
RUN dotnet publish -c Release -o out
|
|
421
|
+
|
|
422
|
+
FROM mcr.microsoft.com/dotnet/aspnet:8.0
|
|
423
|
+
WORKDIR /app
|
|
424
|
+
RUN useradd -m -u 1001 app
|
|
425
|
+
COPY --from=builder --chown=app:app /app/out ./
|
|
426
|
+
USER app
|
|
427
|
+
EXPOSE 8080
|
|
428
|
+
HEALTHCHECK CMD curl -f http://localhost:8080/health || exit 1
|
|
429
|
+
ENTRYPOINT ["dotnet", "MyApp.dll"]
|
|
430
|
+
```
|
|
431
|
+
|
|
432
|
+
## Common Patterns Across Languages
|
|
433
|
+
|
|
434
|
+
### Development vs Production
|
|
435
|
+
|
|
436
|
+
```dockerfile
|
|
437
|
+
# syntax=docker/dockerfile:1
|
|
438
|
+
ARG NODE_ENV=production
|
|
439
|
+
|
|
440
|
+
FROM node:20-alpine AS development
|
|
441
|
+
ENV NODE_ENV=development
|
|
442
|
+
WORKDIR /app
|
|
443
|
+
COPY package*.json ./
|
|
444
|
+
RUN npm install
|
|
445
|
+
COPY . .
|
|
446
|
+
CMD ["npm", "run", "dev"]
|
|
447
|
+
|
|
448
|
+
FROM node:20-alpine AS production
|
|
449
|
+
ENV NODE_ENV=production
|
|
450
|
+
WORKDIR /app
|
|
451
|
+
COPY package*.json ./
|
|
452
|
+
RUN npm ci --only=production
|
|
453
|
+
COPY . .
|
|
454
|
+
RUN addgroup -g 1001 -S nodejs && adduser -S nodejs -u 1001
|
|
455
|
+
USER nodejs
|
|
456
|
+
CMD ["node", "server.js"]
|
|
457
|
+
|
|
458
|
+
FROM ${NODE_ENV} AS final
|
|
459
|
+
```
|
|
460
|
+
|
|
461
|
+
### With Database Migrations
|
|
462
|
+
|
|
463
|
+
```dockerfile
|
|
464
|
+
# Add entrypoint script
|
|
465
|
+
COPY docker-entrypoint.sh /usr/local/bin/
|
|
466
|
+
RUN chmod +x /usr/local/bin/docker-entrypoint.sh
|
|
467
|
+
ENTRYPOINT ["docker-entrypoint.sh"]
|
|
468
|
+
CMD ["python", "app.py"]
|
|
469
|
+
```
|
|
470
|
+
|
|
471
|
+
**docker-entrypoint.sh:**
|
|
472
|
+
```bash
|
|
473
|
+
#!/bin/sh
|
|
474
|
+
set -e
|
|
475
|
+
|
|
476
|
+
# Run migrations
|
|
477
|
+
python manage.py migrate
|
|
478
|
+
|
|
479
|
+
# Start application
|
|
480
|
+
exec "$@"
|
|
481
|
+
```
|
|
482
|
+
|
|
483
|
+
## Framework-Specific Tips
|
|
484
|
+
|
|
485
|
+
### Next.js
|
|
486
|
+
- Use standalone output mode for smaller images
|
|
487
|
+
- Set `NEXT_TELEMETRY_DISABLED=1`
|
|
488
|
+
- Copy only `.next/standalone` and `.next/static`
|
|
489
|
+
|
|
490
|
+
### Django
|
|
491
|
+
- Run `collectstatic` during build
|
|
492
|
+
- Use gunicorn or uvicorn for production
|
|
493
|
+
- Include database client libraries
|
|
494
|
+
|
|
495
|
+
### Spring Boot
|
|
496
|
+
- Use layered JARs for better caching
|
|
497
|
+
- Include actuator for health checks
|
|
498
|
+
- Set appropriate JVM memory limits
|
|
499
|
+
|
|
500
|
+
### FastAPI
|
|
501
|
+
- Use uvicorn with workers for production
|
|
502
|
+
- Include health check endpoint
|
|
503
|
+
- Use `--proxy-headers` if behind proxy
|
|
504
|
+
|
|
505
|
+
## References
|
|
506
|
+
|
|
507
|
+
- [Official Docker Samples](https://github.com/docker/awesome-compose)
|
|
508
|
+
- [Node.js Docker Best Practices](https://github.com/nodejs/docker-node/blob/main/docs/BestPractices.md)
|
|
509
|
+
- [Python Docker Best Practices](https://docs.python-guide.org/shipping/docker/)
|
|
510
|
+
- [Go Docker Best Practices](https://docs.docker.com/language/golang/build-images/)
|