Bosh sahifa Wiki Dockerfile

Dockerfile

Dockerfile — container image’ni qanday qurishni ketma-ket instructionlar bilan tavsiflaydigan matnli fayl. U base image, fayllar, dependency, environment, build command va container ishga tushirish buyrug‘ini belgilaydi. docker build Dockerfile va build contextdan qatlamli, tarqatiladigan image hosil qiladi.

Asosiy instructionlar

FROM base image’ni, WORKDIR keyingi buyruqlarning ish katalogini belgilaydi. COPY build contextdagi faylni imagega oladi, RUN build vaqtida command bajaradi. CMD container default buyrug‘ini, ENTRYPOINT esa executable interfeysini belgilaydi.

FROM node:22-alpine
WORKDIR /app
COPY package*.json ./
RUN npm ci --omit=dev
COPY . .
CMD ["node", "server.js"]

Exec form JSON array signal va argumentlarni shell interpretatsiyasisiz executablega uzatadi. Shell form variable expansion va shell operatorlarini beradi, lekin PID 1 hamda signal xatti-harakati boshqacha bo‘lishi mumkin.

Build cache

Har instruction odatda layer yaratadi. Layer inputi o‘zgarmasa build cache qayta ishlatilishi mumkin. Dependency manifestni source koddan oldin copy qilish source o‘zgarganda qimmat dependency install qatlamini saqlaydi.

COPY . . build contextdagi keraksiz fayllarni ham olishi mumkin. .dockerignore Git metadata, local dependency, secret va build artefaktlarini contextdan chiqaradi. Secretni faqat keyingi layerda o‘chirish xavfsiz emas, chunki oldingi layer tarixida qolishi mumkin. BuildKit secret mount maxfiy qiymatni layerga yozmasdan build commandga vaqtincha beradi.

Multi-stage build

Bir stage compiler va development dependency bilan artefakt yaratadi, final stage esa faqat runtime fayllarni oladi.

FROM node:22 AS build
WORKDIR /src
COPY . .
RUN npm ci && npm run build

FROM node:22-alpine
WORKDIR /app
COPY --from=build /src/dist ./dist
CMD ["node", "dist/server.js"]

Natija kichikroq va compiler vositalarisiz bo‘ladi. Final image base’i build stage bilan ABI jihatdan mos bo‘lishi kerak, ayniqsa native dependency mavjud bo‘lsa.

Foydalanuvchi va filesystem

Default container user root bo‘lishi mumkin. USER orqali ilova uchun cheklangan hisob tanlanadi. Fayl ownership COPY --chown bilan beriladi. Faqat read-only root filesystemda ishlash uchun yoziladigan temp va upload kataloglari alohida volume yoki tmpfsga chiqariladi.

EXPOSE portni hujjatlashtiradi, hostda avtomatik publish qilmaydi. VOLUME ham har vazifada kerak emas; storage lifecycle compose yoki orchestrator qatlamida boshqarilishi mumkin.

Takrorlanuvchi image

Mutable latest tag vaqt o‘tishi bilan boshqa base’ga ishora qiladi. Digest bilan pin qilish ayni baytlarni beradi, lekin security update’ni avtomatik olmaydi. Yangilanish bot yoki rejalashtirilgan rebuild bilan nazorat qilinadi. Package manager lockfile dependency versiyasini barqarorlashtiradi.

Image ichida secret va production konfiguratsiya saqlanmaydi. U runtime environment yoki secret manager orqali beriladi. Healthcheck container processi ishlayotganini emas, xizmatning kerakli holatini tekshirishi mumkin.

Build context va ignore

docker build buyrug‘idagi context Dockerfile ko‘ra oladigan fayllar chegarasini belgilaydi. COPY context tashqarisidagi yo‘lni ola olmaydi. Katta context build boshlanishidan oldin daemon yoki masofaviy builderga uzatilgani sababli vaqt va tarmoq sarfini oshiradi. .dockerignore ichiga Git tarixi, dependency kataloglari, test natijalari va maxfiy lokal fayllar kiritiladi. Faqat keyin RUN rm bilan sirni o‘chirish yetarli emas, chunki u oldingi image layerida qolishi mumkin. Build vaqtida kerak bo‘lgan credential uchun BuildKit secret mount kabi qatlamga yozmaydigan mexanizm ishlatiladi.

Bog‘liq tushunchalar

Docker, container image, build context, image layer, multi-stage build, registry, BuildKit