Build1 distinct publisher2 min readUpdated
A dev.to walkthrough hardens node:14 to distroless with two Copilot prompts. The arithmetic says the Alpine stage already banks 98 percent of the size win, so distroless is a blast-radius call.
The Engineer · Build desk
Compiled by The EngineerSomething wrong?How this is made
The size ledger is where the marketing and the arithmetic part ways. The full run drops 804 MB [1], and 789 of them are already banked by the time the multi-stage Alpine build finishes [2], which is 98 percent of the total before distroless enters the story. The distroless swap itself is worth 15 MB, about 12 percent off the Alpine image [3]. The 90 percent in the headline [10] is 88.2 percent [1]. The rounding is not the interesting part. The interesting part is that anyone optimising for registry bytes has no reason to go past phase 2, and the only thing the last 15 MB buys is an image with no apk and no /bin/sh in it [6], which is exactly what the Alpine build still carries [4].
There is a confound in the demonstration worth naming before the CVE number gets quoted in a policy document. The baseline is node:14 [1]; both hardened builds run Node 20 [3][5]. A runtime major version bump and a base-OS change land at the same time, so the source does not let you say how much of the 50-plus critical and high findings [1] died with Node 14 rather than with the shell [4]. A team that upgrades Node and separates build from runtime may collect most of the CVE reduction and still keep a shell to exec into. That is a different decision, and a cheaper one to operate.
What is genuinely mechanical here is the file edit. Two prompts to an agent with terminal rights produced the .dockerignore, the stage split, the non-root user, the build and the scan [8], against a task the author describes as hours of manual trial and error [9]. If that reproduces on a real service, the sentence "we didn't have time to fix the base image" stops describing a capacity problem and starts describing a preference. What the two prompts do not produce is the runbook rewrite that follows from shipping an image with no shell and no package manager [6], and that work does not appear anywhere in a 108 MB number [5].
One caveat on the evidence, which is a single tutorial. The zero-vulnerability result is the author's own Docker Scout run against their own hardened image [7], reported without a date. Scanner output is a reading taken on a day, and once the Dockerfile is right, the day is the variable that moves.
Follow any of these and your For You feed starts watching them — no settings page required.
Ranked by verification strength, evidence, and original report placement.
The article's headline and description claim the image size is slashed by 90%.
A dev.to walkthrough diagnoses a legacy single-stage node:14 image with 'docker scout cves node:14' and reports a total image size of about 912 MB and more than 50 Critical and High CVEs.
The same diagnostic step lists outdated base OS packages, the process running as root, and unnecessary build tools exposed in the runtime as the security risks of the node:14 image.
Refactoring into a multi-stage build on node:20-alpine produced an image tagged app:alpine measuring 123 MB, which the author describes as an 85% reduction.
The author reports that scanning app:alpine still reveals lingering OS package vulnerabilities in Alpine's utility layers, and that Alpine still contains the apk package manager and /bin/sh.
Swapping the production stage to gcr.io/distroless/nodejs20-debian12 and building app:hardened produced a 108 MB image.
Evidence-backed comparisons of source perspectives and observed adoption signals. Read the methodology
Which Builder, Operator, and Investor concerns the observed source mix emphasized—not a truth score.
Evidence, demonstrated adoption, hype gap, incentives, and confidence are assessed independently, each on its own current evidence. How these are measured.
Reproducible commands, self-reported results, one source
The cluster rests on a single self-published tutorial. The size figures are internally consistent and repeated three times (result comparison, matrix, terminal listing), and the commands and prompts are given verbatim, which makes the workflow reproducible. But nothing is independently corroborated, no Docker Scout output, scan date or scanner version is reproduced, the '50+ Critical/High' and '0 vulnerabilities' counts are prose assertions, and the comparison changes runtime major version and base image simultaneously.
One self-reported walkthrough, no deployment signal
The only adoption-shaped datapoint is a single author describing their own local build and scan. There is no organisational deployment, no registry or download telemetry, no CI pipeline evidence and no second practitioner report, so the breadth of Copilot-driven container hardening or distroless Node adoption cannot be scored from this material.
Headline and 'zero-CVE' framing outrun the reported numbers
Overstatement is measurable inside the source itself: the headline claims 90% when the reported figures give 88.2%, the description rounds 912MB up to '1GB', and 'zero-vulnerability' is presented as a settled outcome of the distroless swap even though the multi-stage Alpine step already banks 98.1% of the size win, the distroless delta is 15MB, and the Node 14 to Node 20 upgrade is an uncontrolled second variable. The underlying engineering advice (multi-stage, non-root, shell-less runtime) is sound, which keeps the gap moderate rather than severe.
Self-published tutorial promoting a companion video
The source is an individually authored dev.to post that explicitly directs readers to a live video walkthrough, and its framing ('on autopilot', 'true zero', a round 90% in the title) serves engagement rather than measurement. No vendor sponsorship, affiliate relationship or commercial disclosure is stated, so the visible incentive is creator promotion and audience capture around Copilot and distroless tooling.
Firm on arithmetic, thin on the security outcome
Confidence is moderate: the derived arithmetic is fully checkable from figures the source repeats, so the central editorial point (Alpine banks the size win, distroless is a blast-radius call) is solid. Confidence in the security and labour claims is low - one self-published source, no scan artefacts, no timing data, no independent corroboration and no adoption signal - which caps the overall score.
product
Docker pipes every agent policy decision into your SIEM, and the evidence burden lands on platform teams1 distinct publisher
build
A GAN beauty filter is a device budget allocation, not a feature toggle1 distinct publisher
build
Every viewer hits your HLS key endpoint in the same second, and almost nobody tests it1 distinct publisher
build
The optional EntityManager is the bug: moving the transaction boundary into AsyncLocalStorage1 distinct publisher
Distinct publishers with included, body-backed reporting in this cluster.
dev.to
1 article · August 23, 2026