Muhit o'zgaruvchilari — -e, --env-file
Muammodan boshlaylik
Bitta image — uch xil muhit:
- Ishlab chiqish: lokal baza, debug yoqilgan, test to'lov kalitlari
- Test serveri: test bazasi, debug o'chiq
- Production: haqiqiy baza, haqiqiy kalitlar
Har biri uchun alohida image yasaysizmi? Yo'q — 4-darsdagi asosiy qoida: bitta image hamma joyda. Farq qiladigan sozlamalar image ichiga emas, ishga tushirish paytida — muhit o'zgaruvchilari orqali beriladi.
-e — bitta o'zgaruvchi
docker run -d --name baza \
-e MYSQL_ROOT_PASSWORD=root123 \
-e MYSQL_DATABASE=dokon \
-e MYSQL_USER=dokon_app \
-e MYSQL_PASSWORD=app123 \
-p 127.0.0.1:3306:3306 \
mysql:8.4
Rasmiy image lar o'z sozlamalarini muhit o'zgaruvchilaridan o'qiydi — har birining Docker Hub sahifasida ro'yxat (5-dars). MySQL birinchi ishga tushishda root parolini o'rnatadi, dokon bazasini va dokon_app foydalanuvchisini yaratadi.
Tekshirish:
docker exec baza printenv MYSQL_DATABASE # dokon
Ilovada o'qish
// Node.js
const port = process.env.PORT ?? 3000;
const dbHost = process.env.DB_HOST;
// PHP
$dbHost = getenv('DB_HOST');
# Python
import os
db_host = os.environ.get("DB_HOST", "localhost")
--env-file — fayldan
Ko'p o'zgaruvchi bo'lsa:
# .env.production
NODE_ENV=production
PORT=3000
DB_HOST=baza
DB_NAME=dokon
DB_USER=dokon_app
DB_PASSWORD=Kuchli_Parol_2026
JWT_SECRET=a8f3c9...
docker run -d --name api --env-file .env.production -p 3000:3000 mening-api:1.0
Fayl formati:
KALIT=qiymat, bir qatorda bitta- Qo'shtirnoqlar olib tashlanmaydi:
KEY="abc"→ qiymat"abc"(qo'shtirnoqlar bilan!). ShunchakiKEY=abcyozing #— izoh- O'zgaruvchi almashtirish (
$OTHER) — ishlamaydi
[!WARNING]
.envfayllarini Git ga qo'shmang —.gitignorega. O'rniga.env.example— kalitlar ro'yxati, qiymatlarsiz — Git da saqlanadi, yangi dasturchi uni nusxalab to'ldiradi.
Kompyuterdagi qiymatni uzatish
export API_KEY=abc123
docker run -e API_KEY mening-api # qiymatsiz — kompyuterdagi API_KEY uzatiladi
Qiymat buyruq tarixida (history) ko'rinmaydi — biroz xavfsizroq.
Dockerfile dagi standart qiymatlar
Image ichida standart qiymat (13-dars):
ENV NODE_ENV=production
ENV PORT=3000
docker run -e PORT=8080 — standartni almashtiradi. Ustuvorlik: -e > --env-file > Dockerfile ENV.
Maxfiy ma'lumotlar haqida
Muhit o'zgaruvchilari — konfiguratsiya uchun standart usul, lekin maxfiy ma'lumot (parol, API kalit) uchun ideal emas:
docker inspect api # barcha muhit o'zgaruvchilari ochiq ko'rinadi!
docker inspectga kirish huquqi bor har kim ko'radi- Xato hisobotlarida va loglarda tasodifan chop etilishi mumkin
- Ilova ichidagi barcha bolalar jarayonlariga meros qoladi
Ishlab chiqish va kichik loyihalar uchun — normal. Jiddiy production uchun — Docker secrets yoki tashqi secret menejeri (Vault, AWS Secrets Manager) — fayl sifatida ulanadi (29, 39-darslar).
[!WARNING] Maxfiy ma'lumotni hech qachon Dockerfile dagi
ENVga yozmang. U image qatlamida abadiy qoladi va image ni olgan har kim (docker history,docker inspect) uni ko'radi — image ommaviy registry ga yuklansa, butun dunyo.
12-factor tamoyili
"Konfiguratsiya — muhitda" — zamonaviy ilovalar tamoyillaridan (The Twelve-Factor App). Ilova kodi va image hamma muhitda bir xil; farq qiladigan narsalar (baza manzili, kalitlar, rejim) — faqat muhit o'zgaruvchilarida. Natija:
- Bitta image ni sinab, aynan shuni production ga chiqarasiz
- Kodni o'zgartirmasdan, image ni qayta yasamasdan — sozlamani o'zgartirish
- Kodda hech qanday maxfiy ma'lumot yo'q
Nima uchun shunday?
Nima uchun sozlamalar konfiguratsiya faylida emas, muhit o'zgaruvchilarida?
Chunki muhit o'zgaruvchilari — universal: har qanday tilda, har qanday OS da, har qanday platformada (Docker, Kubernetes, Heroku, Vercel) bir xil ishlaydi. Konfiguratsiya fayli esa — ma'lum formatda (JSON, YAML, INI), ma'lum joyda, image ga qo'shilgan yoki tashqaridan ulangan bo'lishi kerak. Bundan tashqari, fayllar tasodifan Git ga tushib qoladi. Muhit o'zgaruvchilari — ilova va infratuzilma o'rtasidagi eng oddiy "shartnoma".
Xulosa
Eslab qoling:
- Bitta image — hamma muhitda; farqlar — muhit o'zgaruvchilarida
-e KALIT=qiymat,--env-file fayl- Rasmiy image lar sozlamalarni env dan o'qiydi — Docker Hub sahifasida ro'yxat
.env— Git ga emas;.env.example— Git ga--env-fileda qo'shtirnoqlar olib tashlanmaydi- Ustuvorlik:
-e>--env-file> DockerfileENV - Maxfiy ma'lumot —
docker inspectda ko'rinadi; DockerfileENVga hech qachon
Keyingi dars
11-dars: 1-2 bo'lim mashqlari — MySQL va Adminer konteynerda