10-bo‘lim

Muhit, sozlama va sirlar

ENV va ARG farqi, --env-file, hamda nega --build-arg orqali berilgan sir obraz tarixida qolib ketadi.

🕑 19 daqiqa o‘qish 📄 738 so‘z 👁 0 marta ko‘rilgan
Ushbu bo‘lim mundarijasi
  1. ENV - standart qiymat
  2. -e bilan almashtirish
  3. --env-file - ro'yxatni fayldan
  4. Hostdagi qiymatni uzatish
  5. Konteynerda qanday ko'rinadi
  6. ARG - faqat qurish paytida
  7. Tuzoq: --build-arg sirni yashirmaydi
  8. To'g'ri yo'l: BuildKit siri
  9. Sozlamani fayl orqali berish
  10. Xulosa

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 #

DOCKERFILE
FROM alpine:3.21
ENV DOKON_MUHIT=ishlab-chiqish
ENV DOKON_PORT=8080
CMD ["sh", "-c", "echo \"muhit=$DOKON_MUHIT port=$DOKON_PORT\""]
Terminal
docker run --rm sozla:1
Natija
muhit=ishlab-chiqish port=8080

Obrazda yozilgan qiymat - bu standart, majburiy emas.

-e bilan almashtirish #

Terminal
docker run --rm -e DOKON_MUHIT=ishlab-chiqarish sozla:1
Natija
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:

Natija
DOKON_MUHIT=sinov
DOKON_PORT=9090
Terminal
docker run --rm --env-file dokon.env sozla:1
Natija
muhit=sinov port=9090
--env-file faylini git ga qo'shmang

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

Terminal
export DOKON_MUHIT=hostdan
docker run --rm -e DOKON_MUHIT sozla:1
Natija
muhit=hostdan port=8080

Bu CI da qulay: sir CI tizimining o'zgaruvchisida turadi va buyruq satriga yozilmaydi.

Konteynerda qanday ko'rinadi #

Terminal
docker run --rm --hostname dokon sozla:1 env | sort
Natija
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.

ARG va ENV qachon yashaydi Qurish paytida Ishga tushganda ARG - bor ARG - yo'q ENV - bor ENV - bor Lekin ikkalasi ham obraz TARIXIDA qoladi docker history va docker inspect ularni ochiq matnda ko'rsatadi. Sirni ikkalasi orqali ham uzatmang.
ARG ishga tushganda yo'qoladi - lekin tarixdan yo'qolmaydi
DOCKERFILE
FROM alpine:3.21
ARG QURISH_RAQAMI=0
RUN echo "qurish paytida: $QURISH_RAQAMI"
CMD ["sh", "-c", "echo \"ishga tushganda: [$QURISH_RAQAMI]\""]
Terminal
docker run --rm sozla:2
Natija
ishga tushganda: []

Bo'sh. ARG qurish tugashi bilan yo'qoladi.

Qurish paytida esa bor - qiymatni --build-arg bilan beramiz:

Terminal
docker run --rm sozla:3
Natija
qurish paytida: 42

Bu obraz shunday qurilgan edi:

Natija
docker build --build-arg QURISH_RAQAMI=42 -t sozla:3 .
ARGENV
Qurish paytidaBorBor
KonteynerdaYo'qBor
Qiymat berish--build-arg-e, --env-file
Odatiy ishlatilishiVersiya, asos obraz tegiIlova 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:

DOCKERFILE
FROM alpine:3.21
ARG API_KALIT
RUN echo "kalit uzunligi: ${#API_KALIT}" > /uzunlik.txt
CMD ["cat", "/uzunlik.txt"]
Terminal
docker run --rm sirli:1
Natija
kalit uzunligi: 14

Kalitning o'zi konteynerda yo'q - faqat uzunligi. Ko'ringanidek xavfsiz. Endi tarixga qaraymiz:

Terminal
docker history sirli:1 --no-trunc --format '{{.CreatedBy}}' \
    | grep -i kalit | head -2 | fold -sw 74
Natija
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:

Terminal
docker inspect sirli:2 -f '{{range .Config.Env}}{{println .}}{{end}}' \
    | grep PAROL
Natija
PAROL=juda-maxfiy
Obrazdan sirni o'chirib bo'lmaydi

Keyingi qadamda RUN unset API_KALIT yozish yordam bermaydi - tarix yozuvi joyida qoladi.

Sir obrazga tushgan bo'lsa, yagona to'g'ri javob:

  1. Sirni bekor qiling (provayder panelida)
  2. Yangisini yarating
  3. 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:

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

Natija
docker build --secret id=apikalit,src=kalit.txt -t xavfsiz:1 .
Terminal
docker run --rm xavfsiz:1
Natija
sir uzunligi: 19

Sir RUN paytida /run/secrets/apikalit da mavjud edi. Endi tarixni tekshiramiz:

Terminal
docker history xavfsiz:1 --no-trunc --format '{{.CreatedBy}}' \
    | grep -q 'sk_live' && echo "SIR BOR - yomon" || echo "sir yo'q - yaxshi"
Natija
sir yo'q - yaxshi

Konteynerda ham qolmagan:

Terminal
docker run --rm xavfsiz:1 ls /run/secrets 2>&1 | head -1
Natija
ls: /run/secrets: No such file or directory

Sir faqat o'sha bitta RUN davomida mavjud bo'ldi va qatlamga yozilmadi.

UsulQurish paytidaTarixda qoladimi
--build-argBorHa - ochiq matnda
ENVBorHa - ochiq matnda
--secretBorYo'q
-e (ishga tushirishda)Yo'qYo'q

Sozlamani fayl orqali berish #

Muhit o'zgaruvchisi hamma narsa uchun mos emas: nginx sozlamasi yoki sertifikat - bu fayl.

Terminal
docker run --rm -v /tmp/sozlama/konf:/etc/dokon:ro alpine:3.21 \
    cat /etc/dokon/dokon.conf
Natija
tinglash_porti = 8080
jurnal_darajasi = info

:ro bilan ulanganini unutmang - konteyner sozlamani o'zgartira olmasin.

Qaysi birini tanlash?
NimaQanday
Port, jurnal darajasi, muhit nomiENV / -e
Baza manzili, xizmat URL lariENV / -e
Parol, API kalit, tokenSir boshqaruvchisi yoki --secret
Nginx konfigi, sertifikatFayl sifatida ulash
Qurish versiyasi, asos obraz tegiARG

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.
  • ENV obrazdagi standart qiymatni beradi, -e uni ishga tushirishda almashtiradi.
  • Qiymatsiz -e NOM hostdagi o'zgaruvchini uzatadi - CI uchun qulay.
  • --env-file uzun ro'yxat uchun; bu faylni git ga qo'shmang.
  • ARG faqat qurish paytida yashaydi, konteynerda yo'q.
  • Lekin ARG ham, ENV ham obraz tarixida ochiq matnda qoladi - docker history va docker inspect ularni ko'rsatadi.
  • --build-arg bilan 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=secret ishlating - u tarixga ham, qatlamga ham tushmaydi.
  • Fayl ko'rinishidagi sozlamani :ro bilan ulang.
Amaliy topshiriq
  1. ENV bilan standart qiymat bering va uni -e bilan almashtiring.
  2. --env-file yarating va ikki o'zgaruvchini undan bering.
  3. -e NOM (qiymatsiz) bilan hostdagi qiymatni uzating.
  4. ARG e'lon qilib, uni konteynerda chop etishga urinib ko'ring.
  5. --build-arg bilan qiymat berib, qurish paytida ishlashini tasdiqlang.
  6. --build-arg bilan soxta kalit berib, uni docker history da toping.
  7. ENV dagi parolni docker inspect bilan toping.
  8. RUN --mount=type=secret bilan qayta quring.
  9. Tarixda sir yo'qligini tekshiring.
  10. Loyihangizdagi sozlamalarni uch guruhga ajrating: ENV, fayl va sir.

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.