Borrowing it
Nothing to install: this file belongs to jenreh/appkit-bpmn-server. Take a copy, put it at the same path in your own repository, and replace the rules that are about this project with yours.
curl -O https://raw.githubusercontent.com/jenreh/appkit-bpmn-server/main/.github/skills/multi-stage-dockerfile/SKILL.mdgit clone --depth 1 https://github.com/jenreh/appkit-bpmn-serverWrote this? Show the measurements
A badge with what this costs and how it scanned, read live from this page, so it follows the numbers instead of freezing them. Markdown for a README, HTML for a documentation site or a project page.
[](https://agentmods.dev/skills/jenreh/appkit-bpmn-server/multi-stage-dockerfile)<a href="https://agentmods.dev/skills/jenreh/appkit-bpmn-server/multi-stage-dockerfile"><img src="https://agentmods.dev/badge/skills/jenreh/appkit-bpmn-server/multi-stage-dockerfile/github.svg" alt="Measured on agentmods" height="20"></a>Or the 80×15 button, for a site that already has a row of RSS and ATOM ones. Only the verdict fits; the numbers stay here.
<a href="https://agentmods.dev/skills/jenreh/appkit-bpmn-server/multi-stage-dockerfile"><img src="https://agentmods.dev/badge/skills/jenreh/appkit-bpmn-server/multi-stage-dockerfile.svg" alt="Reviewed on agentmods" width="80" height="20"></a>What it costs to keep this loaded
Counted locally with the o200k_base tokenizer, which is exact for GPT models; Claude uses its own tokenizer and its counts differ. Treat this as one consistent yardstick across the catalogue rather than a bill. Prices are per million input tokens.
| Model | Per session | Once invoked |
|---|---|---|
| Fable 5.1 | $0.00057 | $0.02063 |
| Opus 5 | $0.00028 | $0.01032 |
| Sonnet 5 | $0.00011 | $0.00413 |
| Haiku 4.5 | $0.00006 | $0.00206 |
Grade B, and why
multi-stage-dockerfile scanned grade B with 2 findings against 26 rules in 11 categories — prompt injection, anti-refusal, data exfiltration, privilege escalation, supply chain, agent snooping, system-prompt leakage, SSRF and excessive agency — measured 8d ago.
A static scan of the body, not an audit. Every finding is printed with the line that produced it so you can judge whether it matters here. A mod is markdown that instructs an agent; that is exactly why what it instructs is worth reading.
Recursive force deletemediumDestructive command
rm -rf with a variable or a broad path is one typo away from removing the wrong tree.
&& rm -rf /var/lib/apt/lists/* Downgraded: this mod is about security review, or the phrase is quoted, so it is likely naming the pattern rather than instructing it.
Makes network callslowCapability
Not a fault in itself. Listed so you know the mod talks to something, and to what.
&& apt-get install -y --no-install-recommends curl ca-certificates \ This is a copy
100% identical to docker-multi-stage — 10 lines differ, which has more behind it and is treated as the original. This page carries a canonical link to it rather than competing with it.
How it starts
The opening of the file, as written. The whole thing — 259 lines — stays where its author put it; the contents beside it link to each section on GitHub.
Multi-Stage Dockerfiles
Quick reference
- Multi-stage builds — separate builder from runtime; copy only artifacts.
- Pin versions — use exact image tags (
python:3.13-slim-bookworm, notpython). - Minimize layers — combine
RUNcommands with&&; order from least→most changing. - Non-root user — always set
USERin the final stage. - Cache mounts — use
--mount=type=cachefor package manager caches. - Healthchecks — add
HEALTHCHECKfor production readiness.
Stage structure
dependencies → build → (test) → runtime
Use meaningful stage names with the AS keyword.
# ── Stage 1: Builder ──
FROM python:3.13-slim-bookworm AS builder
# install build deps, compile, fetch packages
# ── Stage 2: Runtime ──
FROM python:3.13-slim-bookworm AS runtime
# copy only runtime artifacts from builder
COPY --from=builder /app /app
Key rules
- Builder stage — install compilers, dev headers, build tools. Run
pip install,npm ci,cargo build, etc. - Runtime stage — start from a minimal base; copy only the built output, virtual env, or binary.
- Never install build-only tools (
gcc,make,node-gyp) in the runtime stage.
Base image selection
| Goal | Recommended base | Notes |
|---|---|---|
| Smallest possible | distroless / alpine |
No shell; harder to debug |
| Balance size + compat | *-slim variants |
Good default for Python, Node |
| Full tooling needed | *-bookworm / *-bullseye |
Use only in builder stage |
- Always pin to a specific tag:
python:3.13-slim-bookworm,node:22-alpine3.20. - Match builder and runtime base OS family when possible to avoid glibc mismatches.
Layer optimization
Order: stable → volatile
# 1. System deps (rarely change)
RUN apt-get update && apt-get install -y --no-install-recommends \
libpq-dev \
&& rm -rf /var/lib/apt/lists/*
# 2. Dependency manifests (change occasionally)
COPY pyproject.toml uv.lock ./
# 3. Install deps (cached unless manifests change)
RUN --mount=type=cache,target=/root/.cache/uv \
uv sync --frozen --no-install-project
# 4. Application code (changes frequently)
COPY . .
What this file has done since we first saw it
Hashed on every crawl. A supply-chain change to an agent config is a question of when, not whether, so the history is kept rather than the latest state alone.
- 8d ago First seen · 259 lines · 57 tokens per session scan B 1794f27da6c2
multi-stage-dockerfile is a skill published in the GitHub repository jenreh/appkit-bpmn-server (0 stars, last pushed 2mo ago), licensed MIT. It adds 57 tokens to every session and 2,063 once invoked, about $0.0003 per session on Opus 5. A static security scan graded it B with 2 findings (recursive force delete, makes network calls). It is 100% identical to docker-multi-stage, differing in 10 lines, and is treated as a copy.
Other skills, from other repositories
portainer-mcp-hygiene
How to drive the Portainer MCP server's tools correctly — both reading and mutating. Reading: project responses with select (JMESPath), where the heavy fields live (snapshots, status blocks, managed fields), how to handle non-JSON Docker/K8s proxy endpoints (container and pod logs, stats, exec), and how to interpret…
safe-email-operations
Use email through the bundled mcp-email-server MCP server, diagnose bounded non-secret state, and hand account or credential setup to a user-operated CLI or authenticated local UI.
rival-search-mcp
Deterministic deep research via RivalSearchMCP. 9 tools: 5-engine web search (DuckDuckGo/Bing/Yahoo/Mojeek/Wikipedia), 9-platform social search (Reddit/HN/StackOverflow/Dev.to/Medium/ProductHunt/Bluesky/Lobste.rs/Lemmy), 5-source news (Google/Bing/Guardian/GDELT/DDG), 5 academic DBs…
harness
To build an AI harness: run, observe, validate, automate repeated work faster — CLI/MCP actions, devcontainers, skills, subagents, hooks, pipelines, automations.
b123d-modeling
Use this skill when asked to model, build, or modify a 3D part or assembly with build123d — from a text description, a technical drawing (image or PDF), dimensions in a spec, or an existing STEP/STL file.
b123d-repair
Use this skill when validate() or the export() gate reports FAIL on a shape — an imported STEP that arrives broken, or a solid your own construction damaged — and the goal is a watertight, manifold, BRepCheck-valid solid that passes the export gate without changing the geometry beyond the defect itself.