Skip to content

fix(deploy): pull MinIO from quay.io - Docker Hub now denies minio/minio and minio/mc - #422

Open
AminDhouib wants to merge 1 commit into
masterfrom
fix/minio-quay-registry
Open

fix(deploy): pull MinIO from quay.io - Docker Hub now denies minio/minio and minio/mc#422
AminDhouib wants to merge 1 commit into
masterfrom
fix/minio-quay-registry

Conversation

@AminDhouib

Copy link
Copy Markdown
Member

Incident

Docker Hub has revoked anonymous pull access to the MinIO namespace. Every Dokploy deployment of the BioFlow production compose stack has failed since 2026-09-12T10:43Z, within about 4 seconds of docker compose up --build, at the image pull.

This repository's docker-compose.yml (the pnpm e2e:minio:up local storage stack for the upload-validation gate) pins both images by bare digest on Docker Hub. That does not help: the digest is resolved through the same denied repository, so the pull fails exactly as a tag pull would.

Evidence

Anonymous manifest GET https://registry-1.docker.io/v2/<repo>/manifests/<tag>, with a token minted from auth.docker.io for the requested scope:

repo tag token manifest error
minio/minio latest 200 401 UNAUTHORIZED
minio/minio RELEASE.2025-09-07T16-13-09Z 200 401 UNAUTHORIZED
minio/mc latest 200 401 UNAUTHORIZED
library/postgres 16-alpine 200 200

The token endpoint still issues a token and library/postgres still resolves over the identical anonymous flow, so this is a repository-level access revocation on the MinIO namespace, not a rate limit and not a deleted tag. Confirmed through the Docker daemon:

$ docker pull minio/mc:RELEASE.2025-07-21T05-28-08Z
Error response from daemon: pull access denied for minio/mc, repository does not exist or may require 'docker login'

$ docker pull quay.io/minio/mc:RELEASE.2025-07-21T05-28-08Z@sha256:fb8f773eac8ef9d6da0486d5dec2f42f219358bcb8de579d1623d518c9ebd4cc
Digest: sha256:fb8f773eac8ef9d6da0486d5dec2f42f219358bcb8de579d1623d518c9ebd4cc

mirror.gcr.io is not an alternative: it is a pull-through cache of Docker Hub and now returns 404 MANIFEST_UNKNOWN for these tags.

What changed

The digests do not change. The two digests this compose already pinned are the same two digests quay.io serves, so the upload-validation gate keeps running the exact bytes it was verified against. Only the registry host moves, and each reference gains its human-readable release tag so the file says which release each digest is instead of only a hash:

was now
minio/minio@sha256:14cea493d9a34af32f... quay.io/minio/minio:RELEASE.2025-09-07T16-13-09Z@sha256:14cea493d9a34af32f...
minio/mc@sha256:a7fe349ef4bd8521fb... quay.io/minio/mc:RELEASE.2025-08-13T08-35-41Z@sha256:a7fe349ef4bd8521fb...

Full digests: sha256:14cea493d9a34af32f524e538b8346cf79f3321eff8e708c1e2960462bd8936e and sha256:a7fe349ef4bd8521fb8497f55c6042871b2ae640607cf99d9bede5e9bdf11727. Both were re-fetched from quay.io by digest to confirm they resolve there.

The To bump: comment above them is also updated: it told the next maintainer to pull :latest from Docker Hub and run docker image inspect minio/minio:latest, which would now simply fail.

No version change whatsoever, no port or env changes, nothing else touched.

Validation

  • docker compose -f docker-compose.yml config — exit 0, both services resolving to the quay references.
  • LF endings, 0 CR bytes (git ls-files --eol reports i/lf w/lf).

Not changed, deliberately

apps/landing/content/docs/guides/storage/minio.mdx:48 shows minio/minio server /data in a self-hosting guide for end users running their own MinIO. It is prose documentation rather than a pull path this repo executes, so it is out of scope for this fix and was left alone. Worth a separate look if the denial turns out to be permanent.

Rollback

Revert this commit. That restores the Docker Hub digest references, which will fail to pull until Docker Hub restores anonymous access to the MinIO namespace.

…nio and minio/mc

Docker Hub has revoked anonymous pull access to the MinIO namespace. An
anonymous manifest GET against registry-1.docker.io returns 401 UNAUTHORIZED
for every tag of minio/minio and minio/mc, including :latest, while the token
endpoint still issues a token for the scope and library/postgres:16-alpine
returns 200 over the identical flow.

    docker pull minio/mc:RELEASE.2025-07-21T05-28-08Z
    Error response from daemon: pull access denied for minio/mc,
    repository does not exist or may require 'docker login'

A digest pin does not help: the digest is resolved through the same denied
repository, so `pnpm e2e:minio:up` fails at the pull exactly like a tag pull
would. The same root cause has been failing every Dokploy deploy of the
BioFlow production compose stack since 2026-09-12T10:43Z.

quay.io, MinIO's other official registry, serves these exact images.
Critically, THE DIGESTS ARE UNCHANGED - the two digests this compose already
pinned are the same two digests quay.io serves, so the upload-validation gate
keeps running the bytes it was verified against:

    quay.io/minio/minio:RELEASE.2025-09-07T16-13-09Z
      sha256:14cea493d9a34af32f524e538b8346cf79f3321eff8e708c1e2960462bd8936e
    quay.io/minio/mc:RELEASE.2025-08-13T08-35-41Z
      sha256:a7fe349ef4bd8521fb8497f55c6042871b2ae640607cf99d9bede5e9bdf11727

Both were re-fetched from quay.io by digest to confirm they resolve.

The bare digest references also gain their human-readable release tag, so the
file now says which release each digest is, instead of only a hash.

Changed: docker-compose.yml - the two image references, and the "To bump"
comment above them, which told the next maintainer to pull :latest from
Docker Hub and would now just fail.

No version change whatsoever. Rollback: revert this commit.
@codesandbox

codesandbox Bot commented Sep 13, 2026

Copy link
Copy Markdown

Review or Edit in CodeSandbox

Open the branch in Web EditorVS CodeInsiders

Open Preview

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant