4-bo‘lim

Dockerfile asoslari

O'z obrazingizni qurish: FROM, WORKDIR, COPY, RUN, ENV va CMD ko'rsatmalari hamda .dockerignore.

🕑 15 daqiqa o‘qish 📄 766 so‘z 👁 0 marta ko‘rilgan
Ushbu bo‘lim mundarijasi
  1. Eng kichik Dockerfile
  2. Qurish
  3. Qatlamlarni tekshirish
  4. Asosiy ko'rsatmalar
  5. RUN bilan buyruq bajarish
  6. Qurish konteksti va .dockerignore
  7. WORKDIR papkani yaratadi
  8. ENV va uni almashtirish
  9. CMD ni almashtirish
  10. Xulosa

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:

Terminal
cat salom.sh
Natija
#!/bin/sh
echo "Dokon xizmati ishga tushdi"
echo "Versiya: ${DOKON_VERSIYA:-noma'lum}"

Endi uni obrazga joylaydigan Dockerfile:

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.

Har bir ko'rsatma nima qiladi FROM alpine:3.21 Asosni tanlaydi - qurish shu yerdan boshlanadi. Har Dockerfile da birinchi. qatlam WORKDIR /ilova Ishchi papkani belgilaydi va uni yo'q bo'lsa yaratadi. qatlam COPY salom.sh . Hostdagi faylni obraz ichiga ko'chiradi. qatlam ENV DOKON_VERSIYA Muhit o'zgaruvchisi - fayl tizimini o'zgartirmaydi. 0B CMD ["./salom.sh"] Konteyner ishga tushganda nima bajarilishini aytadi. 0B Ko'k - fayl tizimini o'zgartiradi va qatlam yaratadi. Sariq - faqat metama'lumot.
Har bir ko'rsatma qatlam yaratmaydi - ba'zilari faqat metama'lumot

Qurish #

Natija
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:

Natija
#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
Sizdagi chiqish biroz boshqacha bo'ladi

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:

Terminal
docker run --rm dokon:1.0
Natija
Dokon xizmati ishga tushdi
Versiya: 1.0

Qatlamlarni tekshirish #

Terminal
docker history dokon:1.0 --format 'table {{.Size}}\t{{.CreatedBy}}' \
    | cut -c1-70
Natija
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'rsatmaVazifasi
FROMAsos obrazni tanlaydi; birinchi bo'lishi shart
WORKDIRIshchi papkani belgilaydi va yaratadi
COPYHostdan obrazga fayl ko'chiradi
ADDCOPY kabi, lekin arxivni ochadi va URL dan yuklaydi
RUNQurish paytida buyruq bajaradi
ENVMuhit o'zgaruvchisi o'rnatadi
ARGFaqat qurish paytida yashaydigan o'zgaruvchi
EXPOSEQaysi portni tinglashini hujjatlaydi
USERKeyingi qadamlar qaysi foydalanuvchi nomidan ishlashini
CMDStandart buyruq
ENTRYPOINTO'zgarmas buyruq
ADD o'rniga COPY ishlating

ADD 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:

DOCKERFILE
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.

Har bir RUN alohida qatlam

Uchta RUN - uchta qatlam. Shuning uchun bog'liq buyruqlar bitta RUN ichida && bilan birlashtiriladi:

Natija
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:

Natija
maxfiy/
*.log

Sinab ko'ramiz. Papkada maxfiy/kalit.txt va katta.log bor; Dockerfile esa hamma narsani ko'chiradi:

DOCKERFILE
FROM alpine:3.21
WORKDIR /ilova
COPY . .
CMD ["ls", "-1", "/ilova"]
Terminal
docker run --rm dokon:2.0
Natija
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 ham

COPY . . 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:

Natija
.git
.env
*.log
node_modules

WORKDIR papkani yaratadi #

Terminal
docker run --rm dokon:2.0 pwd
Natija
/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:

Terminal
docker run --rm dokon:1.0 env | grep DOKON
Natija
DOKON_VERSIYA=1.0

Ishga tushirishda uni almashtirish mumkin:

Terminal
docker run --rm -e DOKON_VERSIYA=2.5 dokon:1.0
Natija
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:

Terminal
docker run --rm dokon:1.0 echo "boshqa buyruq"
Natija
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.
  • FROM birinchi bo'lishi shart - u asos obrazni tanlaydi.
  • WORKDIR ishchi papkani belgilaydi va yaratadi.
  • COPY hostdan obrazga fayl ko'chiradi; ADD faqat arxiv ochish kerak bo'lganda.
  • RUN qurish paytida bajariladi va natijasi obrazga yoziladi; har bir RUN - alohida qatlam.
  • Keyingi qatlamda rm qilish obrazni kichraytirmaydi - fayl oldingi qatlamda qoladi.
  • ENV va CMD 0B: ular metama'lumot, fayl qatlami emas.
  • docker build -t nom:teg . - oxirgi nuqta qurish konteksti, ya'ni Docker ko'radigan papka.
  • .dockerignore keraksiz va maxfiy fayllarni kontekstdan chiqaradi; har bir loyihada bo'lishi kerak.
  • CMD ni ishga tushirishda almashtirish mumkin, -e bilan esa ENV qiymatini.
Amaliy topshiriq
  1. Uch qatorli Dockerfile yozing va uni quring.
  2. docker history bilan qaysi qadam 0B ekanini aniqlang.
  3. RUN ni uchga bo'lib, so'ng bittaga birlashtirib, obraz hajmini solishtiring.
  4. .dockerignore yarating va COPY . . dan keyin nima ko'chganini tekshiring.
  5. .env faylini .dockerignore siz ko'chirib, uni obraz ichida toping.
  6. WORKDIR ni ikki marta ishlatib, nisbiy yo'l qanday ishlashini ko'ring.
  7. ENV qiymatini -e bilan almashtiring.
  8. CMD ni buyruq satridan almashtirib ko'ring.
  9. apk add ni --no-cache bilan va usiz bajarib, hajm farqini o'lchang.
  10. O'z loyihangiz uchun Dockerfile yozing va quring.

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.