Bind mount — kodni konteynerga ulash, hot reload
Muammodan boshlaylik
Ilova Docker da. Kodda bitta harfni o'zgartirdingiz — natijani ko'rish uchun:
docker build -t ilova .
docker rm -f ilova
docker run -d --name ilova -p 3000:3000 ilova
Har o'zgarishda 20-30 soniya. Kuniga yuzlab o'zgarish.
Yechim — kodni image ga ko'chirmasdan, kompyuterdagi papkani konteynerga to'g'ridan-to'g'ri ulash. Fayl o'zgardi — konteyner uni darhol ko'radi.
Bind mount nima
docker run -v /kompyuterdagi/papka:/konteynerdagi/papka image
Docker boshqaradigan papka emas, sizning papkangiz. Ikki tomonga ishlaydi:
- Kompyuterda o'zgartirsangiz — konteyner darhol ko'radi
- Konteyner yozsa — kompyuterda paydo bo'ladi
Hot reload
docker run --rm -it \
-p 3000:3000 \
-v "$(pwd)":/app \
-v /app/node_modules \
-w /app \
node:22-alpine \
sh -c "npm install && npm run dev"
-v "$(pwd)":/app— butun loyiha papkasi konteynerga-v /app/node_modules— muhim hiyla (pastda)npm run dev(tsx watch/nodemon) — fayl o'zgarsa server qayta ishga tushadi
Kodni o'zgartiring — server qayta yuklanadi. Rebuild yo'q.
node_modules muammosi
-v "$(pwd)":/app butun papkani ulaydi — kompyuterdagi node_modules bilan birga. Lekin u Windows/macOS uchun kompilyatsiya qilingan (15-dars), konteyner esa — Linux.
-v /app/node_modules — shu yo'lga anonim volume. U bind mount ustiga "qopqoq" bo'ladi: konteyner ichidagi node_modules — kompyuterniki emas, konteynerning o'zi. npm install u yerga Linux uchun paketlarni o'rnatadi.
Konfiguratsiya fayllari
docker run -d -p 80:80 \
-v "$(pwd)/nginx.conf":/etc/nginx/conf.d/default.conf:ro \
nginx:1.27-alpine
docker run -d -e POSTGRES_PASSWORD=x \
-v "$(pwd)/init.sql":/docker-entrypoint-initdb.d/init.sql:ro \
postgres:17
:ro — konteyner konfiguratsiyani o'zgartira olmasin.
Yo'llar va platformalar
-v "$(pwd)":/app # Linux, macOS, WSL
-v "${PWD}":/app # PowerShell
-v "%cd%":/app # CMD
Yo'lda bo'sh joy bo'lsa — qo'shtirnoqlar majburiy. Compose da (27-dars) nisbiy yo'llar (./src) bemalol ishlaydi.
[!WARNING] Windows / macOS da tezlik: bind mount Docker Desktop VM chegarasidan o'tadi — katta loyihalarda sezilarli sekin. Windows da loyihani WSL ichida saqlang (2-dars).
Fayl o'zgarishi sezilmasa
-e CHOKIDAR_USEPOLLING=true # nodemon, webpack, eski Vite
-e WATCHPACK_POLLING=true # Next.js
Yoki Compose ning watch imkoniyati (30-dars).
Fayl egasi muammosi (Linux)
Konteyner root sifatida bind mount papkaga fayl yaratsa — kompyuterda u root ga tegishli bo'ladi, va siz uni o'chira olmaysiz. Yechim:
docker run --rm -u "$(id -u):$(id -g)" -v "$(pwd)":/app -w /app node:22-alpine npm run build
Docker Desktop da bu muammo deyarli yo'q.
Qachon nima
| Holat | Tanlov |
|---|---|
| Ishlab chiqishda kod — hot reload | Bind mount |
| Konfiguratsiya fayli | Bind mount :ro |
| Baza ma'lumotlari | Volume |
| Foydalanuvchi yuklagan fayllar | Volume |
| Production da kod | Hech biri — image ichida (COPY) |
[!INFO] Production da kodni bind mount bilan ulamang. Image ning butun ma'nosi — "bir xil, o'zgarmas paket" (4-dars).
Nima uchun shunday?
Ishlab chiqishda maqsad — tezlik: kod har daqiqada o'zgaradi, natijani darhol ko'rish kerak. Production da — barqarorlik: aynan sinalgan kod ishlashi kerak. Docker ikkalasini qo'llab-quvvatlaydi: bir xil muhit (Node versiyasi, OS kutubxonalari), lekin kod — ishlab chiqishda ulangan, production da qotirilgan.
Xulosa
Eslab qoling:
- Bind mount — kompyuterdagi papkani konteynerga ulash; ikki tomonlama
-v "$(pwd)":/app+-v /app/node_modules- Hot reload —
npm run dev+ bind mount, rebuild siz - Konfiguratsiya —
:ro - Windows: loyiha WSL ichida; sezilmasa — polling
- Linux:
-u "$(id -u):$(id -g)" - Production da kod — image ichida
Keyingi dars
21-dars: Volume backup va tiklash, tmpfs