Environment variable
Environment variable нь аппликейшнд тохиргоо дамжуулах стандарт арга. Кодоо өөрчлөхгүйгээр өөр өөр орчинд (dev, staging, production) тохируулах боломж олгодог.
-e флаг — нэг хувьсагч дамжуулах
docker run -e ХУВЬСАГЧИЙН_НЭР=утга image_name
Жишээнүүд:
docker run -d \
--name postgres \
-e POSTGRES_PASSWORD=secret123 \
-e POSTGRES_USER=admin \
-e POSTGRES_DB=mydb \
postgres:16
docker run -d \
--name myapp \
-e NODE_ENV=production \
-e PORT=3000 \
-e API_KEY=abc123xyz \
-p 3000:3000 \
myapp:1.0
Node.js аппликейшнд:
const port = process.env.PORT || 3000;
const env = process.env.NODE_ENV || "development";
const apiKey = process.env.API_KEY;
console.log(`${env} орчинд ${port} port дээр ажиллаж байна`);
--env-file флаг — файлаас уншиx
Олон хувьсагч байвал .env файлд хадгалж дамжуулна:
.env файл:
NODE_ENV=production
PORT=3000
DB_HOST=db
DB_PORT=5432
DB_NAME=mydb
DB_USER=admin
DB_PASSWORD=secret123
JWT_SECRET=verylongsecretkey
API_URL=https://api.example.com
Дамжуулах:
docker run -d \
--name myapp \
--env-file .env \
-p 3000:3000 \
myapp:1.0
.env файлыг .gitignore-д нэмэхээ мартахгүй:
# .gitignore
.env
.env.local
.env.production
ENV заавар — Dockerfile-д
ENV заавар нь image-д environment variable суулгана. Container үүсгэх бүрт тэр утга анхдагч байна.
FROM node:20-alpine
WORKDIR /app
# Анхдагч утгатай environment variable
ENV NODE_ENV=production
ENV PORT=3000
ENV LOG_LEVEL=info
COPY package*.json ./
RUN npm install --omit=dev
COPY . .
EXPOSE ${PORT}
CMD ["node", "index.js"]
docker run-д -e флаг ашиглавал Dockerfile-д тодорхойлсон утгыг дарж бичнэ:
# NODE_ENV=development болно (Dockerfile-ийн production-г дарна)
docker run -e NODE_ENV=development myapp
ARG vs ENV
# ARG — зөвхөн build явцад байна
ARG BUILD_DATE
ARG GIT_COMMIT
# ENV — build ба runtime хоёуланд байна
ENV APP_VERSION=1.0.0
ENV BUILD_DATE=${BUILD_DATE}
docker build \
--build-arg BUILD_DATE=$(date -u +%Y-%m-%dT%H:%M:%SZ) \
--build-arg GIT_COMMIT=$(git rev-parse --short HEAD) \
-t myapp:1.0 .
Container-ийн environment variable шалгах
# Тодорхой container-ийн env var жагсаах
docker exec myapp env
# Нэг хувьсагч харах
docker exec myapp printenv NODE_ENV
# docker inspect-д харуулах
docker inspect myapp | grep -A 20 '"Env"'
Гаралт:
NODE_ENV=production
PORT=3000
DB_HOST=db
PATH=/usr/local/sbin:/usr/local/bin:...
Нууц мэдээлэл (secret) аюулгүй дамжуулах
❌ Муу — image-д нууц мэдээлэл хадгалах:
ENV DB_PASSWORD=secret123 # Image-д хадгалагдана, аюултай!
✅ Сайн — runtime-д дамжуулах:
docker run -e DB_PASSWORD=secret123 myapp
✅ Хамгийн сайн — .env файлаас:
docker run --env-file .env.production myapp
.env.production файл нь .gitignore-д байх ёстой — git-д commit хийхгүй.
Практик жишээ — Node.js + PostgreSQL
app.js:
const { Pool } = require("pg");
const pool = new Pool({
host: process.env.DB_HOST || "localhost",
port: parseInt(process.env.DB_PORT || "5432"),
database: process.env.DB_NAME || "mydb",
user: process.env.DB_USER || "postgres",
password: process.env.DB_PASSWORD,
});
const port = parseInt(process.env.PORT || "3000");
// HTTP server...
.env:
PORT=3000
DB_HOST=postgres
DB_PORT=5432
DB_NAME=mydb
DB_USER=admin
DB_PASSWORD=supersecret
Ажиллуулах:
# PostgreSQL
docker run -d \
--name postgres \
--network mynet \
-e POSTGRES_DB=mydb \
-e POSTGRES_USER=admin \
-e POSTGRES_PASSWORD=supersecret \
postgres:16
# Node.js апп
docker run -d \
--name nodeapp \
--network mynet \
--env-file .env \
-p 3000:3000 \
nodeapp:1.0
.env файлын форматын дүрмүүд
# Тайлбар мөр
KEY=value
# Хоосон зай байхгүй байх
KEY=value # ✓
KEY = value # ✗ (хоосон зайтай)
# Хашилт шаардлагагүй (гэхдээ зөвшөөрнө)
KEY=hello world # ✓
KEY="hello world" # ✓
# Хоосон утга
KEY= # Хоосон мөр
# Тусгай тэмдэгт агуулсан утга
PASSWORD="p@ss#w0rd!"
Docker Compose-д environment variable
Docker Compose ашиглавал .env файлыг автоматаар уншина (13-р хичээлд дэлгэрэнгүй үзнэ):
services:
app:
image: myapp:1.0
environment:
- NODE_ENV=production
- PORT=3000
env_file:
- .env
db:
image: postgres:16
environment:
POSTGRES_PASSWORD: ${DB_PASSWORD} # .env файлаас авна
POSTGRES_DB: ${DB_NAME}
Дараагийн хичээлд:
Docker network — container-ууд хэрхэн харилцах, bridge, host, overlay network-ийн ялгааг судална.