Bind mount — kodni konteynerga ulash, hot reload

~12 daq · Docker · Ma'lumotlarni saqlash

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