CI image builds break on Alpine docker-cli -rN bumps
Problem
The four runtime Dockerfiles in `engine/` pin `docker-cli` to an exact Alpine package revision:
- `engine/Dockerfile.ci-checker`
- `engine/Dockerfile.dblab-cli`
- `engine/Dockerfile.dblab-server`
- `engine/Dockerfile.dblab-server-debug`
All four currently use `apk add --no-cache ... docker-cli=29.1.3-r4 ...`. Alpine's community repo only keeps the latest `-rN` build of a given upstream version; when the package is rebuilt (CVE backport, newer toolchain) the previous revision disappears from the index.
That happened around 2026-05-18, when `docker-cli-29.1.3-r5` replaced `-r4`. Combined with the preceding `apk upgrade --no-cache`, the install step is now unsatisfiable:
``` ERROR: unable to select packages: docker-cli-29.1.3-r5: breaks: world[docker-cli=29.1.3-r4] ```
Every MR pipeline rebuilding these images fails until the pin is bumped (!1148 (merged)/!1149 (merged)/!1150 (merged)/!1151 (merged) all hit this).
History
- Strict pin introduced 2026-05-07 in commit f111b75b (MR !1144 (merged)) when the base was switched from `docker:29.4.1` to plain `alpine:3.23`.
- Last green master pipeline: 2026-05-18 03:07 UTC.
- First red: MR !1148 (merged) at 2026-05-18 10:12 UTC — so the `-r4` revision lasted ~11 days.
Fix
Loosen the pin to apk's fuzzy operator: `docker-cli~29.1.3`. This accepts any `-rN` rebuild of the same upstream version, so routine Alpine CVE rebuilds no longer break CI, while the explicit upstream version remains as audit/intent signal. Tracked in the accompanying MR.
This is a defensible compromise vs the alternatives:
- Drop the pin entirely — simpler, but loses the explicit upstream-version statement.
- Snapshot/mirror Alpine repos — proper reproducibility, but disproportionate infra work for this need.
Note: `~29.1.3` will still need a manual bump when Alpine ships `29.1.4` or moves past it; this is a less-frequent failure mode of the same class.