Docker / Environment variable

Environment variable

Environment variable нь аппликейшнд тохиргоо дамжуулах стандарт арга. Кодоо өөрчлөхгүйгээр өөр өөр орчинд (dev, staging, production) тохируулах боломж олгодог.

-e флаг — нэг хувьсагч дамжуулах

bash
docker run -e ХУВЬСАГЧИЙН_НЭР=утга image_name

Жишээнүүд:

bash
docker run -d \
  --name postgres \
  -e POSTGRES_PASSWORD=secret123 \
  -e POSTGRES_USER=admin \
  -e POSTGRES_DB=mydb \
  postgres:16
bash
docker run -d \
  --name myapp \
  -e NODE_ENV=production \
  -e PORT=3000 \
  -e API_KEY=abc123xyz \
  -p 3000:3000 \
  myapp:1.0

Node.js аппликейшнд:

javascript
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 файл:

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

Дамжуулах:

bash
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 үүсгэх бүрт тэр утга анхдагч байна.

dockerfile
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-д тодорхойлсон утгыг дарж бичнэ:

bash
# NODE_ENV=development болно (Dockerfile-ийн production-г дарна)
docker run -e NODE_ENV=development myapp

ARG vs ENV

dockerfile
# ARG — зөвхөн build явцад байна
ARG BUILD_DATE
ARG GIT_COMMIT

# ENV — build ба runtime хоёуланд байна
ENV APP_VERSION=1.0.0
ENV BUILD_DATE=${BUILD_DATE}
bash
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 шалгах

bash
# Тодорхой 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-д нууц мэдээлэл хадгалах:

dockerfile
ENV DB_PASSWORD=secret123  # Image-д хадгалагдана, аюултай!

✅ Сайн — runtime-д дамжуулах:

bash
docker run -e DB_PASSWORD=secret123 myapp

✅ Хамгийн сайн — .env файлаас:

bash
docker run --env-file .env.production myapp

.env.production файл нь .gitignore-д байх ёстой — git-д commit хийхгүй.

Практик жишээ — Node.js + PostgreSQL

app.js:

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

env
PORT=3000
DB_HOST=postgres
DB_PORT=5432
DB_NAME=mydb
DB_USER=admin
DB_PASSWORD=supersecret

Ажиллуулах:

bash
# 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 файлын форматын дүрмүүд

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-р хичээлд дэлгэрэнгүй үзнэ):

yaml
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-ийн ялгааг судална.