.dockerignore — keraksiz fayllarni chiqarib tashlash
Muammodan boshlaylik
docker build -t ilova .
[+] Building 47.3s
=> [internal] load build context
=> => transferring context: 612.48MB ← ?!
Ilova kodi — 2 MB. Docker esa 612 MB yuboryapti. Ichida:
node_modules— 450 MB (image ichida baribirnpm cibilan qayta o'rnatiladi).git— 150 MB tarix.env— ishlab chiqish parollari — endi image ichidadist/,coverage/, loglar
Natija: sekin build, katta image, va eng yomoni — maxfiy ma'lumot image da.
Build konteksti
docker build ... . dagi nuqta — build konteksti (12-dars). Docker build boshlanishidan oldin butun papkani Docker dvigateliga yuboradi. COPY . . esa undagi hamma narsani image ga ko'chiradi.
.dockerignore — Docker ga "bu fayllarni umuman yuborma" deydi. .gitignore ga o'xshash.
Node.js uchun .dockerignore
Loyiha ildizida, Dockerfile yonida:
# Bog'liqliklar — image ichida qayta o'rnatiladi
node_modules
npm-debug.log*
# Build natijalari
dist
build
coverage
.next
# Git
.git
.gitignore
# Maxfiy va lokal sozlamalar
.env
.env.*
!.env.example
# Muharrir va OS
.vscode
.idea
*.swp
.DS_Store
Thumbs.db
# Docker fayllarning o'zi
Dockerfile*
docker-compose*.yml
compose*.yaml
.dockerignore
# Hujjat va testlar (production image ga kerak bo'lmasa)
README.md
docs
tests
*.test.js
Natija:
=> => transferring context: 1.84MB
Sintaksis
| Naqsh | Ma'nosi |
|---|---|
node_modules |
Ildizdagi node_modules papka / fayl |
**/node_modules |
Istalgan chuqurlikdagi |
*.log |
Ildizdagi barcha .log fayllar |
**/*.log |
Hamma joydagi .log fayllar |
.env.* |
.env.local, .env.production ... |
!.env.example |
Istisno — chiqarilganlar ichidan qaytarish |
# matn |
Izoh |
Tartib muhim: istisno (!) — umumiy qoidadan keyin.
Nima uchun node_modules ni chiqarish shart
Bu shunchaki hajm masalasi emas:
- Boshqa OS: sizning
node_modulesingiz Windows yoki macOS uchun kompilyatsiya qilingan native modullarni (bcrypt,sharp) o'z ichiga oladi. Konteyner — Linux. Ular u yerda ishlamaydi:
Error: /app/node_modules/bcrypt/lib/binding/bcrypt_lib.node: invalid ELF header
Ustidan yozish:
RUN npm cidan keyinCOPY . .— kompyuterdaginode_modulesimage dagi to'g'risining ustidan yoziladi.Kesh:
node_modulesdagi har qanday o'zgarishCOPY . .keshini buzadi.
Ruxsat ro'yxati yondashuvi
Chiqarish ro'yxatini to'ldirib borish o'rniga — hammasini chiqarib, faqat keraklisini qaytarish:
# Hammasini chiqarish
*
# Faqat kerakli narsalar
!package.json
!package-lock.json
!src/
!tsconfig.json
Xavfsizroq: yangi maxfiy fayl yoki keraksiz papka qo'shilsa ham, u tasodifan image ga tushmaydi. Kamchiligi — yangi kerakli fayl qo'shilganda ro'yxatni yangilashni unutmaslik kerak.
Tekshirish
Image ichida nima borligini ko'rish:
docker run --rm -it ilova sh -c "ls -la /app"
docker run --rm ilova find /app -name ".env*"
.env topilsa — .dockerignore ishlamayapti: fayl nomi .dockerignore (nuqta bilan boshlanadi) va build konteksti ildizida ekanini tekshiring.
Nima uchun shunday?
Nima uchun Docker .gitignore ni o'zi o'qimaydi — ko'pincha ro'yxatlar bir xil-ku?
Chunki ular turli savollarga javob beradi. .gitignore — "nima repozitoriyga tushmasin". .dockerignore — "nima image ga tushmasin". Ular kesishadi, lekin bir xil emas: README.md, testlar, Dockerfile Git da bo'lishi kerak, lekin production image da — yo'q. dist/ Git da yo'q, lekin ba'zi Dockerfile lar uni oldindan yasalgan holda kutishi mumkin. Alohida fayl — har bir savolga aniq javob.
Xulosa
Eslab qoling:
- Build konteksti —
.papkasi butunlay yuboriladi .dockerignore— Dockerfile yonida, ildizda- Majburiy:
node_modules,.git,.env*(!.env.example), build natijalari node_modules— boshqa OS uchun kompilyatsiya qilingan, ustidan yozadi, keshni buzadi!— istisno; ruxsat ro'yxati (*+!kerakli) — eng xavfsiz- Image ichini tekshiring:
.envyo'qmi
Keyingi dars
16-dars: Multi-stage build — kichik va xavfsiz image