10-bo‘lim
Muhit, sozlama va sirlar
ENV va ARG farqi, --env-file, hamda nega --build-arg orqali berilgan sir obraz tarixida qolib ketadi.
Ushbu bo‘lim mundarijasi
Bitta obraz ishlab chiqish, sinov va ishlab chiqarishda ishlashi kerak. Farq faqat sozlamada bo'lsin - obrazda emas.
Bu bobda sozlamani konteynerga uzatishning uch yo'li va bitta jiddiy xavfsizlik tuzog'i ko'riladi.
ENV - standart qiymat #
FROM alpine:3.21
ENV DOKON_MUHIT=ishlab-chiqish
ENV DOKON_PORT=8080
CMD ["sh", "-c", "echo \"muhit=$DOKON_MUHIT port=$DOKON_PORT\""]
docker run --rm sozla:1
muhit=ishlab-chiqish port=8080
Obrazda yozilgan qiymat - bu standart, majburiy emas.
-e bilan almashtirish #
docker run --rm -e DOKON_MUHIT=ishlab-chiqarish sozla:1
muhit=ishlab-chiqarish port=8080
Bitta o'zgaruvchi almashdi, ikkinchisi standart qiymatida qoldi.
--env-file - ro'yxatni fayldan #
Uchta-to'rttadan ko'p o'zgaruvchi bo'lsa, buyruq satri o'qib bo'lmas holga keladi:
DOKON_MUHIT=sinov
DOKON_PORT=9090
docker run --rm --env-file dokon.env sozla:1
muhit=sinov port=9090
--env-file faylini git ga qo'shmangBu fayl odatda parol va kalitlarni saqlaydi.
.gitignore va .dockerignore ga qo'shing, namuna sifatida esa
dokon.env.namuna faylini qoldiring - unda qiymatlar bo'sh
bo'lsin.
Hostdagi qiymatni uzatish #
Qiymatsiz -e hostdagi o'zgaruvchini oladi:
export DOKON_MUHIT=hostdan
docker run --rm -e DOKON_MUHIT sozla:1
muhit=hostdan port=8080
Bu CI da qulay: sir CI tizimining o'zgaruvchisida turadi va buyruq satriga yozilmaydi.
Konteynerda qanday ko'rinadi #
docker run --rm --hostname dokon sozla:1 env | sort
DOKON_MUHIT=ishlab-chiqish
DOKON_PORT=8080
HOME=/root
HOSTNAME=dokon
PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin
Bizning ikkitamiz va Docker qo'shgan uchtasi.
ARG - faqat qurish paytida #
ARG va ENV o'xshash ko'rinadi, lekin umri boshqacha.
FROM alpine:3.21
ARG QURISH_RAQAMI=0
RUN echo "qurish paytida: $QURISH_RAQAMI"
CMD ["sh", "-c", "echo \"ishga tushganda: [$QURISH_RAQAMI]\""]
docker run --rm sozla:2
ishga tushganda: []
Bo'sh. ARG qurish tugashi bilan yo'qoladi.
Qurish paytida esa bor - qiymatni --build-arg bilan beramiz:
docker run --rm sozla:3
qurish paytida: 42
Bu obraz shunday qurilgan edi:
docker build --build-arg QURISH_RAQAMI=42 -t sozla:3 .
ARG | ENV | |
|---|---|---|
| Qurish paytida | Bor | Bor |
| Konteynerda | Yo'q | Bor |
| Qiymat berish | --build-arg | -e, --env-file |
| Odatiy ishlatilishi | Versiya, asos obraz tegi | Ilova sozlamasi |
Tuzoq: --build-arg sirni yashirmaydi #
Ko'pchilik ARG ni "sir uzatishning xavfsiz yo'li" deb o'ylaydi,
chunki u konteynerda ko'rinmaydi. Tekshiramiz.
Obraz --build-arg API_KALIT=sk_live_MAXFIY bilan qurilgan:
FROM alpine:3.21
ARG API_KALIT
RUN echo "kalit uzunligi: ${#API_KALIT}" > /uzunlik.txt
CMD ["cat", "/uzunlik.txt"]
docker run --rm sirli:1
kalit uzunligi: 14
Kalitning o'zi konteynerda yo'q - faqat uzunligi. Ko'ringanidek xavfsiz. Endi tarixga qaraymiz:
docker history sirli:1 --no-trunc --format '{{.CreatedBy}}' \
| grep -i kalit | head -2 | fold -sw 74
RUN |1 API_KALIT=sk_live_MAXFIY /bin/sh -c echo "kalit uzunligi:
${#API_KALIT}" > /uzunlik.txt # buildkit
ARG API_KALIT=sk_live_MAXFIY
Sir ochiq matnda, ikki joyda. Obrazni registry ga yuborsangiz, uni ko'ra oladigan har kim kalitni oladi.
ENV ham shunday:
docker inspect sirli:2 -f '{{range .Config.Env}}{{println .}}{{end}}' \
| grep PAROL
PAROL=juda-maxfiy
Keyingi qadamda RUN unset API_KALIT yozish yordam bermaydi -
tarix yozuvi joyida qoladi.
Sir obrazga tushgan bo'lsa, yagona to'g'ri javob:
- Sirni bekor qiling (provayder panelida)
- Yangisini yarating
- Obrazni qaytadan quring
Obrazni o'chirish yetarli emas: u allaqachon tortib olingan bo'lishi mumkin.
Bu 20-bobdagi kod auditida yana uchraydi.
To'g'ri yo'l: BuildKit siri #
Qurish paytida sir kerak bo'ladigan holatlar bor - masalan yopiq paket repozitoriysidan yuklab olish.
BuildKit buning uchun alohida mexanizm beradi:
FROM alpine:3.21
RUN --mount=type=secret,id=apikalit \
echo "sir uzunligi: $(wc -c < /run/secrets/apikalit)" > /natija.txt
CMD ["cat", "/natija.txt"]
Qurish:
docker build --secret id=apikalit,src=kalit.txt -t xavfsiz:1 .
docker run --rm xavfsiz:1
sir uzunligi: 19
Sir RUN paytida /run/secrets/apikalit da mavjud edi. Endi
tarixni tekshiramiz:
docker history xavfsiz:1 --no-trunc --format '{{.CreatedBy}}' \
| grep -q 'sk_live' && echo "SIR BOR - yomon" || echo "sir yo'q - yaxshi"
sir yo'q - yaxshi
Konteynerda ham qolmagan:
docker run --rm xavfsiz:1 ls /run/secrets 2>&1 | head -1
ls: /run/secrets: No such file or directory
Sir faqat o'sha bitta RUN davomida mavjud bo'ldi va qatlamga
yozilmadi.
| Usul | Qurish paytida | Tarixda qoladimi |
|---|---|---|
--build-arg | Bor | Ha - ochiq matnda |
ENV | Bor | Ha - ochiq matnda |
--secret | Bor | Yo'q |
-e (ishga tushirishda) | Yo'q | Yo'q |
Sozlamani fayl orqali berish #
Muhit o'zgaruvchisi hamma narsa uchun mos emas: nginx sozlamasi yoki sertifikat - bu fayl.
docker run --rm -v /tmp/sozlama/konf:/etc/dokon:ro alpine:3.21 \
cat /etc/dokon/dokon.conf
tinglash_porti = 8080
jurnal_darajasi = info
:ro bilan ulanganini unutmang - konteyner sozlamani o'zgartira
olmasin.
| Nima | Qanday |
|---|---|
| Port, jurnal darajasi, muhit nomi | ENV / -e |
| Baza manzili, xizmat URL lari | ENV / -e |
| Parol, API kalit, token | Sir boshqaruvchisi yoki --secret |
| Nginx konfigi, sertifikat | Fayl sifatida ulash |
| Qurish versiyasi, asos obraz tegi | ARG |
Muhit o'zgaruvchisidagi sir ham ideal emas: u docker inspect
da va jarayon ro'yxatida ko'rinadi. Lekin obraz tarixiga
tushmaydi - bu allaqachon ancha yaxshi.
Xulosa #
- Bitta obraz barcha muhitlarda ishlasin; farq sozlamada bo'lsin.
ENVobrazdagi standart qiymatni beradi,-euni ishga tushirishda almashtiradi.- Qiymatsiz
-e NOMhostdagi o'zgaruvchini uzatadi - CI uchun qulay. --env-fileuzun ro'yxat uchun; bu faylni git ga qo'shmang.ARGfaqat qurish paytida yashaydi, konteynerda yo'q.- Lekin
ARGham,ENVham obraz tarixida ochiq matnda qoladi -docker historyvadocker inspectularni ko'rsatadi. --build-argbilan sir uzatmang: u xavfsiz ko'rinadi, lekin emas.- Obrazga tushgan sirni o'chirib bo'lmaydi - uni bekor qilish kerak.
- Qurish paytidagi sir uchun
RUN --mount=type=secretishlating - u tarixga ham, qatlamga ham tushmaydi. - Fayl ko'rinishidagi sozlamani
:robilan ulang.
ENVbilan standart qiymat bering va uni-ebilan almashtiring.--env-fileyarating va ikki o'zgaruvchini undan bering.-e NOM(qiymatsiz) bilan hostdagi qiymatni uzating.ARGe'lon qilib, uni konteynerda chop etishga urinib ko'ring.--build-argbilan qiymat berib, qurish paytida ishlashini tasdiqlang.--build-argbilan soxta kalit berib, unidocker historyda toping.ENVdagi parolnidocker inspectbilan toping.RUN --mount=type=secretbilan qayta quring.- Tarixda sir yo'qligini tekshiring.
- Loyihangizdagi sozlamalarni uch guruhga ajrating:
ENV, fayl va sir.
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.