4-bo‘lim
Dockerfile asoslari
O'z obrazingizni qurish: FROM, WORKDIR, COPY, RUN, ENV va CMD ko'rsatmalari hamda .dockerignore.
Ushbu bo‘lim mundarijasi
Tayyor obrazlardan foydalanishni bildik. Endi o'zimizniki ni quramiz.
Obraz Dockerfile dan quriladi - bu oddiy matn fayli bo'lib, har bir qatori bitta qadam.
Eng kichik Dockerfile #
Dokon uchun kichik xizmat yozamiz. Avval skript:
cat salom.sh
#!/bin/sh
echo "Dokon xizmati ishga tushdi"
echo "Versiya: ${DOKON_VERSIYA:-noma'lum}"
Endi uni obrazga joylaydigan Dockerfile:
FROM alpine:3.21
WORKDIR /ilova
COPY salom.sh .
ENV DOKON_VERSIYA=1.0
CMD ["./salom.sh"]
Besh qator, beshta ko'rsatma. Har birini ko'rib chiqamiz.
Qurish #
docker build -t dokon:1.0 .
-t obrazga nom va teg beradi, oxiridagi . esa qurish
konteksti - Docker shu papkadagi fayllarni ko'ra oladi.
Chiqish shunday ko'rinadi:
#1 [internal] load build definition from Dockerfile
#1 transferring dockerfile: 130B done
#1 DONE 0.1s
#2 [internal] load metadata for docker.io/library/alpine:3.21
#2 DONE 0.0s
#3 [internal] load .dockerignore
#3 transferring context: 2B done
#3 DONE 0.1s
#4 [internal] load build context
#4 transferring context: 122B done
#4 DONE 0.1s
#5 [1/3] FROM docker.io/library/alpine:3.21@sha256:48b0309ca019d8...
#5 DONE 0.1s
#6 [2/3] WORKDIR /ilova
#6 DONE 0.1s
#7 [3/3] COPY salom.sh .
#7 DONE 0.1s
#8 exporting to image
#8 naming to docker.io/library/dokon:1.0 done
#8 DONE 0.5s
Vaqtlar (0.1s) kompyuteringizga bog'liq, digestlar esa har
qurishda yangilanadi.
Muhimi - tuzilishi: har bir qadam raqamlanadi, [2/3]
ko'rinishidagi hisoblagich qaysi ko'rsatma bajarilayotganini
ko'rsatadi, oxirida esa obraz nomlanadi.
Obraz tayyor. Ishga tushiramiz:
docker run --rm dokon:1.0
Dokon xizmati ishga tushdi
Versiya: 1.0
Qatlamlarni tekshirish #
docker history dokon:1.0 --format 'table {{.Size}}\t{{.CreatedBy}}' \
| cut -c1-70
SIZE CREATED BY
0B CMD ["./salom.sh"]
0B ENV DOKON_VERSIYA=1.0
12.3kB COPY salom.sh . # buildkit
8.19kB WORKDIR /ilova
0B CMD ["/bin/sh"]
8.5MB ADD alpine-minirootfs-3.21.7-x86_64.tar.gz /…
Pastdagi ikki qator - alpine:3.21 dan meros. Yuqoridagi to'rttasi
bizniki. CMD va ENV kutilganidek 0B.
WORKDIR esa 8.19 kB - u bo'sh papka yaratdi, ya'ni fayl tizimini
biroz o'zgartirdi.
Asosiy ko'rsatmalar #
| Ko'rsatma | Vazifasi |
|---|---|
FROM | Asos obrazni tanlaydi; birinchi bo'lishi shart |
WORKDIR | Ishchi papkani belgilaydi va yaratadi |
COPY | Hostdan obrazga fayl ko'chiradi |
ADD | COPY kabi, lekin arxivni ochadi va URL dan yuklaydi |
RUN | Qurish paytida buyruq bajaradi |
ENV | Muhit o'zgaruvchisi o'rnatadi |
ARG | Faqat qurish paytida yashaydigan o'zgaruvchi |
EXPOSE | Qaysi portni tinglashini hujjatlaydi |
USER | Keyingi qadamlar qaysi foydalanuvchi nomidan ishlashini |
CMD | Standart buyruq |
ENTRYPOINT | O'zgarmas buyruq |
ADD o'rniga COPY ishlatingADD ikkita "aqlli" xatti-harakat qiladi: .tar.gz ni avtomatik
ochadi va URL dan fayl yuklaydi.
Ikkalasi ham kutilmagan natija berishi mumkin - masalan arxiv o'zi xohlagan joyga ochilib ketadi.
Qoida: arxivni ataylab ochmoqchi bo'lsangizgina ADD,
qolgan hamma holatda COPY.
RUN bilan buyruq bajarish #
RUN qurish paytida ishlaydi va natijasi obrazga yoziladi:
FROM alpine:3.21
RUN apk add --no-cache curl
WORKDIR /ilova
COPY salom.sh .
CMD ["./salom.sh"]
--no-cache muhim: usiz apk paket indeksini obraz ichida
qoldiradi va obraz bekorga kattalashadi.
RUN alohida qatlamUchta RUN - uchta qatlam. Shuning uchun bog'liq buyruqlar
bitta RUN ichida && bilan birlashtiriladi:
RUN apk add --no-cache curl \
&& curl -o /ilova/ma.json https://misol.uz/ma \
&& rm -rf /var/cache/apk/*
Alohida RUN da rm qilsangiz, fayl oldingi qatlamda
qolaveradi - obraz kichraymaydi.
Qurish konteksti va .dockerignore #
docker build . dagi nuqta - Docker ga butun papkani yuboradi.
Papkada .git, node_modules yoki maxfiy fayllar bo'lsa, ular ham
ketadi.
.dockerignore buni cheklaydi:
maxfiy/
*.log
Sinab ko'ramiz. Papkada maxfiy/kalit.txt va katta.log bor;
Dockerfile esa hamma narsani ko'chiradi:
FROM alpine:3.21
WORKDIR /ilova
COPY . .
CMD ["ls", "-1", "/ilova"]
docker run --rm dokon:2.0
Dockerfile
salom.sh
maxfiy/ ham, katta.log ham obrazga tushmadi. .dockerignore
faylining o'zi ham ko'chirilmadi - Docker uni avtomatik chetlab
o'tadi.
.dockerignore - xavfsizlik chorasi hamCOPY . . yozsangiz va .env fayli papkada bo'lsa, u obrazga
tushadi. Obrazni registry ga yuklasangiz - sir tarqaladi.
Obraz qatlamlaridan faylni o'chirish ham yordam bermaydi: u
oldingi qatlamda qoladi va docker history orqali topiladi.
Har bir loyihada .dockerignore bo'lsin. Eng kamida:
.git
.env
*.log
node_modules
WORKDIR papkani yaratadi #
docker run --rm dokon:2.0 pwd
/ilova
Papka Dockerfile da yaratilmagan edi - WORKDIR uni o'zi yaratdi
va joriy papka qilib qo'ydi.
ENV va uni almashtirish #
Obrazdagi o'zgaruvchi konteynerda ko'rinadi:
docker run --rm dokon:1.0 env | grep DOKON
DOKON_VERSIYA=1.0
Ishga tushirishda uni almashtirish mumkin:
docker run --rm -e DOKON_VERSIYA=2.5 dokon:1.0
Dokon xizmati ishga tushdi
Versiya: 2.5
Obraz o'zgarmadi - faqat shu konteyner boshqa qiymat bilan ishladi. Bu bitta obrazni turli muhitlarda ishlatish uchun asosiy usul; 10-bobda batafsil ko'ramiz.
CMD ni almashtirish #
CMD - standart buyruq, majburiy emas:
docker run --rm dokon:1.0 echo "boshqa buyruq"
boshqa buyruq
./salom.sh umuman ishlamadi. Obraz oxiridagi buyruq echo bilan
almashtirildi.
Buni o'zgarmas qilish kerak bo'lsa, ENTRYPOINT ishlatiladi - keyingi
bobda ikkalasini batafsil solishtiramiz.
Xulosa #
- Obraz Dockerfile dan quriladi; har bir ko'rsatma bitta qadam.
FROMbirinchi bo'lishi shart - u asos obrazni tanlaydi.WORKDIRishchi papkani belgilaydi va yaratadi.COPYhostdan obrazga fayl ko'chiradi;ADDfaqat arxiv ochish kerak bo'lganda.RUNqurish paytida bajariladi va natijasi obrazga yoziladi; har birRUN- alohida qatlam.- Keyingi qatlamda
rmqilish obrazni kichraytirmaydi - fayl oldingi qatlamda qoladi. ENVvaCMD0B: ular metama'lumot, fayl qatlami emas.docker build -t nom:teg .- oxirgi nuqta qurish konteksti, ya'ni Docker ko'radigan papka..dockerignorekeraksiz va maxfiy fayllarni kontekstdan chiqaradi; har bir loyihada bo'lishi kerak.CMDni ishga tushirishda almashtirish mumkin,-ebilan esaENVqiymatini.
- Uch qatorli Dockerfile yozing va uni quring.
docker historybilan qaysi qadam 0B ekanini aniqlang.RUNni uchga bo'lib, so'ng bittaga birlashtirib, obraz hajmini solishtiring..dockerignoreyarating vaCOPY . .dan keyin nima ko'chganini tekshiring..envfaylini.dockerignoresiz ko'chirib, uni obraz ichida toping.WORKDIRni ikki marta ishlatib, nisbiy yo'l qanday ishlashini ko'ring.ENVqiymatini-ebilan almashtiring.CMDni buyruq satridan almashtirib ko'ring.apk addni--no-cachebilan va usiz bajarib, hajm farqini o'lchang.- O'z loyihangiz uchun Dockerfile yozing va quring.
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.