Your pipeline pulls half a gigabyte to run a test suite.

Every job in every pipeline starts by fetching a PHP image. On a generic image that means a full distro userland plus a compiler toolchain your tests never touch — on every branch, every push, every retry. You pay for that twice: in minutes waited and in minutes billed.

A generic PHP image

1 Pull a base image with a full userland
2 docker build to add your extensions
3 Compile what has no prebuilt package
4 Push the result to your own registry
5 Finally: run your tests

Four steps before the job does the thing you actually wanted.

A purpose-built image

1 Pull the layers that changed
2 Run your tests

The image is already composed. There is nothing left to build.

Measure it yourself

Compare against what your pipeline pulls today.

Build an image from your composer.lock on the start page, then put its size next to the one your CI currently fetches. No account needed for that comparison.

How much you save depends entirely on your stack, your runner's cache and how often your pipeline runs — so we are not going to invent a percentage. The structural point holds either way: a smaller image transfers faster, and a prebuilt one removes a build step from every single job.