5-bo‘lim
Qatlam keshi va qurish tartibi
Kesh qanday ishlaydi, nima uni buzadi va Dockerfile ko'rsatmalarini qanday tartibda yozish kerak.
Ushbu bo‘lim mundarijasi
Birinchi qurish sekin bo'lishi tabiiy. Lekin har bir qurish sekin bo'lsa - Dockerfile noto'g'ri yozilgan.
Bu bob bitta amaliy qoida haqida: kam o'zgaradigan narsa yuqorida, tez-tez o'zgaradigan narsa pastda.
Kesh qanday ishlaydi #
Docker har bir ko'rsatma uchun kesh kaliti hisoblaydi. Kalit ikki narsadan tuziladi:
| Ko'rsatma turi | Kalitga nima kiradi |
|---|---|
RUN, ENV, CMD | Ko'rsatma matni |
COPY, ADD | Ko'rsatma matni va ko'chiriladigan fayllar mazmuni |
Kalit oldingi qurishdagi bilan bir xil bo'lsa - qadam bajarilmaydi, tayyor qatlam olinadi.
Eng muhim qoida esa bu:
Ikki Dockerfile #
Bir xil ishni bajaradigan ikkita variantni solishtiramiz.
To'g'ri tartib - bog'liqliklar avval, kod keyin:
FROM alpine:3.21
WORKDIR /ilova
COPY bogliqliklar.txt .
RUN apk add --no-cache curl
COPY ilova.sh .
CMD ["sh", "ilova.sh"]
Noto'g'ri tartib - hammasi birdan:
FROM alpine:3.21
WORKDIR /ilova
COPY . .
RUN apk add --no-cache curl
CMD ["sh", "ilova.sh"]
Farq bitta qatorda: COPY . . hamma narsani ko'chiradi, shu
jumladan tez-tez o'zgaradigan kodni. Demak har kod o'zgarganda
uning kesh kaliti o'zgaradi - va undan keyingi RUN apk add ham
qaytadan bajariladi.
O'lchab ko'ramiz #
Ikkala obraz ham bir marta qurilgan, kesh to'la. Endi kodni o'zgartirib, qaytadan quramiz va nechta qadam keshdan olinganini sanaymiz:
echo 'echo "dokon r1"' > ilova.sh
docker build -f Dockerfile.yaxshi -t yaxshi:2 . 2>&1 | grep -c CACHED
3
echo 'echo "dokon z1"' > ilova.sh
docker build -f Dockerfile.yomon -t yomon:2 . 2>&1 | grep -c CACHED
1
Uch qadam va bir qadam. Noto'g'ri tartibda faqat WORKDIR
keshdan olindi - RUN apk add esa har safar qaytadan ishlaydi.
Mening kompyuterimda bu farq 1.1 soniya va 2.5-3.1 soniya degani. Kichik misol uchun ko'p emas, lekin haqiqiy loyihada bog'liqliklarni o'rnatish bir necha daqiqa davom etadi - va bu har bir kommitda takrorlanadi.
To'g'ri tartibning to'liq chiqishi shunday ko'rinadi:
#5 [1/5] FROM docker.io/library/alpine:3.21@sha256:48b0309ca019...
#6 [2/5] WORKDIR /ilova
#6 CACHED
#7 [3/5] COPY bogliqliklar.txt .
#7 CACHED
#8 [4/5] RUN apk add --no-cache curl
#8 CACHED
#9 [5/5] COPY ilova.sh .
Faqat oxirgi qadam - o'zgargan kod - qaytadan bajarildi.
Bog'liqlik ro'yxatini alohida ko'chiring, o'rnating, keyin kodni ko'chiring:
COPY <bog'liqlik ro'yxati> .
RUN <o'rnatish buyrug'i>
COPY . .
Ro'yxat fayli tilga qarab boshqacha ataladi:
| Ekotizim | Fayl |
|---|---|
| Node | package.json, package-lock.json |
| Python | requirements.txt, poetry.lock |
| PHP | composer.json, composer.lock |
| Go | go.mod, go.sum |
| Rust | Cargo.toml, Cargo.lock |
| Java | pom.xml |
Kod o'zgaradi - bog'liqliklar o'rnatilmaydi. Ro'yxat o'zgaradi - o'shanda o'rnatiladi.
Keshni nima buzadi? #
| Sabab | Izoh |
|---|---|
| Ko'chirilgan fayl mazmuni o'zgardi | COPY uchun eng ko'p uchraydigani |
| Ko'rsatma matni o'zgardi | Hatto bo'sh joy qo'shilsa ham |
| Oldingi qadam buzildi | Zanjir pastga qarab uziladi |
| Asos obraz yangilandi | FROM yangi digestga ishora qildi |
--no-cache berildi | Ataylab chetlab o'tish |
COPY . . va kutilmagan kesh buzilishiCOPY . . butun konteksni kesh kalitiga kiritadi. Demak:
README.mdni tahrirlasangiz - kesh buziladi- Tahrirlovchingiz
.swpfayl qoldirsa - kesh buziladi .git/ichida bitta bayt o'zgarsa - kesh buziladi
.dockerignore shuning uchun tezlik vositasi ham, nafaqat
xavfsizlik chorasi.
Bir RUN ichida tozalash #
Qatlam yaratilgandan keyin undan fayl o'chirish obrazni kichraytirmaydi - fayl oldingi qatlamda qolaveradi.
Noto'g'ri:
RUN apk add --no-cache curl
RUN rm -rf /var/cache/apk/*
To'g'ri:
RUN apk add --no-cache curl \
&& rm -rf /var/cache/apk/*
Ikkinchi variantda o'chirish o'sha qatlamning ichida sodir bo'ladi, shuning uchun o'chirilgan fayl hech qachon qatlamga yozilmaydi.
apt-get update && apt-get install -y --no-install-recommends X \
&& rm -rf /var/lib/apt/lists/*
npm ci --omit=dev && npm cache clean --force
pip install --no-cache-dir -r requirements.txt
Ko'pchilik menejerda "keshni saqlama" bayrog'i bor - undan foydalaning.
Keshni ataylab chetlab o'tish #
Ba'zan kesh noto'g'ri javob beradi. Masalan RUN apk add curl
ko'rsatmasi o'zgarmaydi, lekin repozitoriyda curl ning yangi
versiyasi chiqqan - Docker buni bilmaydi va eski qatlamni beradi.
docker build --no-cache -t dokon:1.0 .
Bu barcha qadamni qaytadan bajaradi.
--no-cache bilan quringAks holda obrazingizda oylik eski tizim paketlari qolib ketishi mumkin - ular orasida yamoqlanmagan zaiflik ham bo'lishi mumkin.
Ko'p jamoalar CI da haftada bir marta --no-cache bilan qurishni
rejalashtiradi.
11-bobdan boshlab bu mavzuga qaytamiz.
Kesh ham joy egallaydi #
docker system df --format 'table {{.Type}}\t{{.Size}}' | grep -i build
Build Cache 26.01MB
Bu kichik misol uchun 26 MB. Faol loyihada kesh bir necha gigabayt ga yetishi mumkin.
Tozalash:
docker builder prune # ishlatilmayotgan kesh
docker builder prune -af # butun kesh
docker builder prune --filter until=168h # bir haftadan eski
Xulosa #
- Docker har ko'rsatma uchun kesh kaliti hisoblaydi;
COPYuchun kalitga fayl mazmuni ham kiradi. - Kesh faqat pastga buziladi: bitta qadam o'zgarsa, undan keyingi hammasi qaytadan bajariladi.
- Asosiy qoida: kam o'zgaradigan yuqorida, tez-tez o'zgaradigan pastda.
- Bog'liqlik ro'yxatini alohida ko'chirib, o'rnatib, keyin kodni ko'chiring - bu naqsh har bir ekotizimda bir xil.
- O'lchangan farq: to'g'ri tartibda 3 ta qadam keshdan, noto'g'risida 1 ta.
COPY . .butun kontekstni kesh kalitiga qo'shadi -READMEtahriri ham keshni buzadi..dockerignore- xavfsizlik chorasi ham, tezlik vositasi ham.- Fayl o'chirish o'sha
RUNichida bo'lsin; keyingi qatlamdagirmobrazni kichraytirmaydi. --no-cachekeshni butunlay chetlab o'tadi; uni vaqti-vaqti bilan ishlating, aks holda eski paketlar qolib ketadi.- Qurish keshi ham disk egallaydi -
docker builder prunebilan tozalanadi.
- Ikkita Dockerfile yozing - to'g'ri va noto'g'ri tartibda.
- Ikkalasini quring, so'ng kodni o'zgartirib,
grep -c CACHEDbilan farqni o'lchang. - Qurish vaqtini ikkala variant uchun o'lchab solishtiring.
README.mdni tahrirlab,COPY . .li variantda kesh buzilishini kuzating..dockerignorega*.mdqo'shib, o'sha tajribani takrorlang.- Ikkita alohida
RUNdaapk addvarmyozib, obraz hajmini o'lchang. - Ularni
&&bilan birlashtirib, hajmni yana o'lchang. --no-cachebilan qurib, vaqt farqini yozing.docker system dfbilan qurish keshi hajmini kuzating.docker builder prunedan keyin qancha joy bo'shaganini aniqlang.
O‘qish tarixini saqlamoqchimisiz?
Tizimga kirsangiz, tugatgan bo‘limlaringiz saqlanadi va qoldirgan joyingizdan davom etasiz.
Xatolik topdingizmi?
Imlo xatosi, ishlamaydigan kod yoki noto‘g‘ri ma‘lumotni ko‘rsangiz - bizga xabar bering. Har bir xabar administrator tomonidan ko‘rib chiqiladi.