An image is a filesystem diff, not a zip.
Containers are taught as a recipe — copy this Dockerfile, change the base image — and the recipe works, which is the problem. This is a layer store and a builder in your browser, with real digests, a cache that invalidates the way the real one does, and a runtime where your process is PID 1 and has to answer for it.
FROM node:24COPY . .RUN npm ci && npm run buildCMD ["sh", "-c", "node dist/server.js"]every commit rebuilds npm ci — COPY . . invalidated it.env is gone from the image and still in layer 21.1 GB modelled, 94% of it the base and the toolchainPID 1 is sh — SIGTERM reaches it and stops there
None of those four is a syntax error and none of them is visible without a model of the layer graph and the runtime contract. So there is one here. The cache rule it teaches is recorded against a real builder before it is taught, and where the corpus and the lesson disagree, the corpus wins.
Seven tracks
What an image is
What is actually inside the thing you just pushed?
The cache
Which of these instructions is about to run again?
Size
Where did the one-point-four gigabytes come from?
PID 1 and signals
What does your container do when it is asked to stop?
Isolation
What is a container hiding, and what is it sharing?
Limits
Was that a crash or was it the OOM killer?
Reading a generated Dockerfile
What will this build, and what will it ship?