Issue 114: quay.io disabled anonymous pulls for minio's own images #102
@@ -0,0 +1,68 @@
|
|||||||
|
---
|
||||||
|
status: located
|
||||||
|
opened: 2026-09-24
|
||||||
|
located-in: [mesh-catalog modules/minio]
|
||||||
|
fixed-by:
|
||||||
|
amended-design:
|
||||||
|
---
|
||||||
|
|
||||||
|
# 114 — quay.io disabled anonymous pulls for minio's own images, breaking the module's pin
|
||||||
|
|
||||||
|
## What was observed
|
||||||
|
|
||||||
|
On the control-node, 2026-09-24, checking `minio` before assigning it — the next module in the
|
||||||
|
`novox` queue after the forge and analytics. `scripts/compare-module-with-running.py` reported no
|
||||||
|
name conflict; separately, the module needs a data migration from a 4-node HA cluster HAL runs
|
||||||
|
into the module's single-node server, which [`DATA-CUTOVER.md`](../../../migration/DATA-CUTOVER.md)
|
||||||
|
already has a rehearsed recipe for (`scripts/rehearse-minio-cutover.sh`, rehearsed 2026-09-20).
|
||||||
|
|
||||||
|
Pulling `quay.io/minio/mc` to run that recipe failed: `unauthorized: access to the requested
|
||||||
|
resource is not authorized`. Not a `novox`-side problem — DNS resolves quay.io correctly, the
|
||||||
|
daemon's `insecure-registries` entries are unrelated, and the auth handshake completes. The token
|
||||||
|
quay.io itself issues is the tell:
|
||||||
|
|
||||||
|
```json
|
||||||
|
{
|
||||||
|
"access": [{"type": "repository", "name": "minio/mc", "actions": []}],
|
||||||
|
"context": {"com.apostille.roots": {"minio/mc": "$disabled"}, "com.apostille.root": "$disabled"}
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
Checked the module's own pinned server image too, not just the tool used to test it —
|
||||||
|
`modules/minio/module.json`'s `quay.io/minio/minio@sha256:14cea493d9a34af32f524e538b8346cf79f3321eff8e708c1e2960462bd8936e`
|
||||||
|
gets the identical answer: token issues, zero actions, `$disabled`. Anonymous pull of **both**
|
||||||
|
images `minio` publishes on quay.io is disabled, upstream, sometime after the 2026-09-20 rehearsal
|
||||||
|
— four days is the outside bound on when this broke.
|
||||||
|
|
||||||
|
A second, already-known gap sits under this one and is not this issue: the module's `runtime`
|
||||||
|
resource still carries a placeholder image
|
||||||
|
(`mesh-runtime-minio@sha256:0000000000000000000000000000000000000000000000000000000000000000`),
|
||||||
|
tracked since `MIGRATION-READINESS-2026-09-21.md` as deferred under
|
||||||
|
[issue 064](../064-a-mesh-build-cannot-fetch-a-modules-external-dependencies/00-report.md).
|
||||||
|
|
||||||
|
## Why it matters beyond this instance
|
||||||
|
|
||||||
|
[Issue 064](../064-a-mesh-build-cannot-fetch-a-modules-external-dependencies/00-report.md) answered
|
||||||
|
*can the mesh's build environment reach a declared vendor image* — a network-policy question,
|
||||||
|
resolved by requiring the image be declared as a build input. It assumed the image, once declared,
|
||||||
|
stays fetchable. This is the case that assumption doesn't cover: the vendor disabled the image
|
||||||
|
itself, for everyone, regardless of network policy or declaration. A pinned digest does not protect
|
||||||
|
against this — the digest still resolves, the registry just refuses to serve it anonymously.
|
||||||
|
|
||||||
|
Any module pinning a third-party image by digest carries this risk silently until the day something
|
||||||
|
needs to pull it fresh — a rebuild, a new node, a cache eviction. Nothing in the catalogue today
|
||||||
|
distinguishes "pinned and known-good" from "pinned and quietly unfetchable."
|
||||||
|
|
||||||
|
## Open questions
|
||||||
|
|
||||||
|
- Is there an authenticated path to these images (a quay.io account, a mirror), or does `minio`
|
||||||
|
need to move to a different distribution channel entirely? HAL's own running cluster is on an
|
||||||
|
older release (`RELEASE.2022-01-07T01-53-23Z`, present in `novox`'s local image cache) — worth
|
||||||
|
checking whether that tag or a similar one is still fetchable from anywhere before assuming the
|
||||||
|
module must repin to whatever's locally cached by accident.
|
||||||
|
- Should the catalogue periodically re-verify that a pinned vendor image is still fetchable, rather
|
||||||
|
than discovering it at the moment a cutover needs it?
|
||||||
|
- Same question issue 109 asked about addresses, asked of images: is a locally-cached copy on one
|
||||||
|
node a fact the mesh can rely on, or a trap for the next node that doesn't have it?
|
||||||
|
|
||||||
|
Handed off for a separate session to work; not blocking the rest of the `novox` module queue.
|
||||||
Reference in New Issue
Block a user