Hiçbir şey değiştirmediniz. Dün çalışan pipeline bugün alpine:3.19’u çekemiyor. İki megabaytlık bir base layer. Ama Docker Hub servis etmeyi reddediyor.
Sebep sizde değil: ofisinizin çıkış IP’sini paylaşan başka bir ekip, siz kahvenizi almadan günün pull kotasını tüketmiş.
Sessizce dolan kota
Docker Hub, kimlik doğrulamasız (anonim) çekimleri IP başına 6 saatte 100 pull ile sınırlıyor. Ücretsiz oturum açmış bir hesapta bu 200’e çıkıyor. Sınır, tek tek geliştiriciye değil, çıkış IP’sine bağlı.
Kritik detay burada: aynı NAT arkasındaki tüm CI runner’ları, tüm Kubernetes node’ları, ofisteki herkes aynı 100’lük kotayı paylaşıyor. Yoğun bir pipeline bunu dakikalar içinde bitirebilir.
Ve “bir pull” sandığınızdan hızlı büyüyor:
- Multi-stage bir Dockerfile’da her
FROMayrı bir pull sayılır.FROM node:20-alpine+FROM python:3.12-slim= iki pull, daha build başlamadan. - Çok mimarili (multi-arch) bir imajda her mimari ayrı pull sayılır.
- Cache’lenmemiş her soğuk runner, sıfırdan yeni bir istemci gibi davranır.
En kötü kısmı: gürültüsüz patlıyor
Bu hata yüksek sesle çökmüyor. toomanyrequests: You have reached your pull rate limit bir yerde belirir, deploy durur, ama ortada bir stack trace yok. Kod hatası aramaya başlarsınız — oysa sorun kodunuzda değil, komşu ekibin sabah build’lerinde.
Playbook
- Her pull’u kimlik doğrula. En basit kazanç:
docker loginile kota IP’den hesaba geçer ve 100’den 200’e çıkar. CI’da bir Docker token’ı yeter. - Pull-through cache / registry mirror kur. Runner’larınız Docker Hub yerine sizin yakınınızdaki bir aynadan çeksin. Aynı imajı gün içinde onlarca kez çekmek tek pull’a düşer.
- Kritik imajları kendi registry’nize kopyalayın. Deploy’unuzun ayakta durması, Docker Hub’ın günlük kotasına bağlı kalmasın.
Dürüst nüans
Bu limitler kalıcı ve mantıklı — Docker Hub bir hayır kurumu değil. Amaç limitleri “aşmak” değil, altyapınızı paylaşılan bir dış kotaya bağımlı olmaktan kurtarmak. Mirror kurmak birkaç saatlik iş; ama karşılığında build’leriniz komşu ekibin trafiğinden bağımsız hale gelir.
Özet
- Anonim pull limiti: IP başına 6 saatte 100 (auth ile 200).
- Sınır kişiye değil, paylaşılan çıkış IP’sine bağlı.
- Multi-stage
FROM’lar ve multi-arch imajlar pull sayısını sessizce katlar. - Çözüm: auth ekle → mirror kur → kritik imajları kendine kopyala.
- En tehlikeli kısmı: sessizce patlar, kod hatası sanırsınız.
CI’ınız hiç açıklanamayan bir “toomanyrequests” ile durdu mu? Sizde nasıl çözüldü, merak ediyorum.