.dockerignore — keraksiz fayllarni chiqarib tashlash

~8 daq · Docker · Dockerfile — o'z image ingiz

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 baribir npm ci bilan qayta o'rnatiladi)
  • .git — 150 MB tarix
  • .env — ishlab chiqish parollari — endi image ichida
  • dist/, 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:

  1. Boshqa OS: sizning node_modules ingiz 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
  1. Ustidan yozish: RUN npm ci dan keyin COPY . . — kompyuterdagi node_modules image dagi to'g'risining ustidan yoziladi.

  2. Kesh: node_modules dagi har qanday o'zgarish COPY . . 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: .env yo'qmi

Keyingi dars

16-dars: Multi-stage build — kichik va xavfsiz image