.dockerignore Dosyasını Unutunca
Context 800 MB, içinde .env duruyor

Sending build context 812 MB yazdı. Dockerfile COPY ile üç dosya alıyordu. Geri kalanı yine paketlendi, hash'lendi, daemon'a yürüdü. İçinde .git, node_modules ve bir .env vardı. İmaj onları COPY etmese bile context tar'ı taşıdı.
Ignore dosyası yoksa daemon, çalışma dizinini olduğu gibi paketler. .dockerignore bir süzgeç, bir incelik değil. Unutulunca üç fatura gelir: süre, cache hash, sızıntı. Üçünü de aynı günde gördüm.
Neyi dışarıda bırakıyorum
.git
**/.env
**/.env.*
**/node_modules
**/bin
**/obj
**/.vs
**/TestResults
*.md
*.md tartışılır; README bazen imaja girer. Ben girmesin. .env tartışılmaz. COPY .env yazmasan da context'te durması, laptop'taki secret'ı build sunucusuna taşır. Log'da görünmez, tar'da durur.
COPY ile karıştırmak
.dockerignore , .gitignore değil. Git'in görmediği node_modules diskte duruyorsa daemon görür. Tersi: git'te olan bir dosyayı ignore etmek, imajı bozar. İki liste ayrı tutulur. Birini diğerine kopyalayıp unuttum; lock dosyası dışarıda kaldı, restore her seferinde ağdan geldi.
Ne sızdı, nasıl baktım
docker build öncesi context'i görmek için tar --exclude-from=.dockerignore -cf - . | wc -c. Ignore yoksa aynı tar 800 MB. Varsa 4 MB. .env tar listesinde duruyorsa imaja COPY etmesen de build sunucusuna gitti. CI runner diskine gitti. Log'a düşmese de artifact değil, yine sızıntı.
IDE dosyaları: .vs, node_modules, bin/Debug. Onları ignore etmeden COPY src/ yazmak yetmez; daemon yine paketler. COPY süzgeci, context süzgeci değil. İki kilit. Birini unutmak, diğerinin anlamını düşürür.
# context hâlâ büyükse bu satırdan önce daemon bekler
COPY package.json package-lock.json ./
RUN npm ci
COPY src/ src/
.env.example gider, .env gitmez. Örnek dosyada gerçek parola yok. **/.env.* yazıp !.env.example ile istisna. Tersi: example'ı da kesmek, yeni klonun ilk build'ini bozar. İkisini ayır.
docker buildx du context'i göstermez, builder diskini gösterir. Yine de 'neden 12 GB builder' sorusuna cevap verir: unutulan cache, unutulan ignore, unutulan ara stage. buildx prune cesaret ister; prune, pinli olmayan latest katmanlarını da yer. Önce ignore, sonra prune.
.dockerignore sözdizimi .gitignore ile aynı değildir. Ünlem istisnası, ** ve kök / davranışı sürümden sürüme ince farklar taşır. Listeyi kısa tut. 80 satırlık kopya gitignore, yanlışlıkla package-lock.json 'ı da keser. Kesince her build ağdan gelir. Kısa liste, okunur liste.
PR şablonuna .dockerignore satırını ekledim: context boyutu nedir. wc -c çıktısı 20 MB'ı aşıyorsa dur. Aşmanın gerekçesi yazılıdır veya yoktur. Yoksa merge yok. Bu kapı, unutulan ignore'u ikinci kez unutturmaz. İkinci kez unutmak, birinciyi öğrendik diye kapatmaktır. Öğrendik cümlesi, .env tekrar context'e girince bitiyor.
.gitdışarıda..envve.env.*dışarıda,.env.exampleiçeride.node_modulesvebindışarıda.- Context 20 MB altında veya gerekçeli.
*.mdve editör klasörleri dışarıda.- Ignore, gitignore kopyası değil; ayrı liste.
Context küçülünce cache yazısındaki sıranın da anlamı olur. 800 MB context'te hash hesabı tek başına dakikadır. Ignore üç satır, pipeline beş dakika. Unutulunca teşhis 'Docker yavaş' olur. Değil. Paketlediğin ağaç büyük.
Yorumlar
Yorumlar (0)
Yorumlar üyelere açık. Üye ol · Giriş yap