Dockerfile Best Practices đ â
āĻāĻāĻāĻŋ āĻĻāĻā§āώ (Efficient), āϏā§āϰāĻā§āώāĻŋāϤ (Secure) āĻāĻŦāĻ āĻā§āĻ āϏāĻžāĻāĻā§āϰ āĻāύā§āĻā§āĻāύāĻžāϰ āĻāĻŽā§āĻ āϤā§āϰāĻŋ āĻāϰāĻžāϰ āĻāύā§āϝ Dockerfile-āĻāϰ āĻāĻŋāĻā§ āĻŦā§āϏā§āĻ āĻĒā§āϰā§āϝāĻžāĻāĻāĻŋāϏ āĻŽā§āύ⧠āĻāϞāĻž āĻ āĻĒāϰāĻŋāĻšāĻžāϰā§āϝāĨ¤ āĻāĻ āĻāĻžāĻāĻĄā§ āĻāĻŽāϰāĻž āĻĒā§āϰā§āĻĄāĻžāĻāĻļāύ-āϰā§āĻĄāĻŋ āĻāĻŽā§āĻ āϤā§āϰāĻŋāϰ āĻŽā§āϞ āĻŽāύā§āϤā§āϰāĻā§āϞ⧠āĻļāĻŋāĻāĻŦā§āĨ¤
ā§§. āϞā§āϝāĻŧāĻžāϰ āϏāĻāĻā§āϝāĻž āĻāĻŽāĻžāύ⧠(Minimize Layers) â
Dockerfile-āĻāϰ āĻĒā§āϰāϤāĻŋāĻāĻŋ RUN, COPY, āĻāĻŦāĻ ADD āĻāύā§āϏāĻā§āϰāĻžāĻāĻļāύ āύāϤā§āύ āĻāĻāĻāĻŋ āϞā§āϝāĻŧāĻžāϰ āϤā§āϰāĻŋ āĻāϰā§āĨ¤ āϝāϤ āĻŦā§āĻļāĻŋ āϞā§āϝāĻŧāĻžāϰ, āĻāĻŽā§āĻā§āϰ āϏāĻžāĻāĻ āϤāϤ āĻŦā§ āĻšā§āĨ¤
- āĻā§āϞ āĻĒāĻĻā§āϧāϤāĻŋ:dockerfile
RUN apt-get update RUN apt-get install -y git RUN apt-get install -y curl - āϏāĻ āĻŋāĻ āĻĒāĻĻā§āϧāϤāĻŋ: āĻāĻāĻžāϧāĻŋāĻ āĻāĻŽāĻžāύā§āĻĄāĻā§
&&āĻĻāĻŋā§ā§ āϝā§āĻā§āϤ āĻāϰā§āύāĨ¤dockerfileRUN apt-get update && apt-get install -y \ git \ curl \ && rm -rf /var/lib/apt/lists/*
⧍. .dockerignore āĻŦā§āϝāĻŦāĻšāĻžāϰ āĻāϰāĻž â
āĻŦāĻŋāϞā§āĻĄ āĻāύā§āĻā§āĻā§āϏāĻ (Build Context) āĻĨā§āĻā§ āĻ
āĻĒā§āϰā§ā§āĻāύā§āϝāĻŧ āĻĢāĻžāĻāϞ (āϝā§āĻŽāύ: node_modules, .git, āϞā§āĻ āĻĢāĻžāĻāϞ) āĻŦāĻžāĻĻ āĻĻā§āĻā§āĻžāϰ āĻāύā§āϝ .dockerignore āĻĢāĻžāĻāϞ āĻŦā§āϝāĻŦāĻšāĻžāϰ āĻāϰā§āύāĨ¤ āĻāĻāĻŋ āĻŦāĻŋāϞā§āĻĄ āĻĒā§āϰāϏā§āϏ āĻĻā§āϰā§āϤ āĻāϰ⧠āĻāĻŦāĻ āĻāĻŽā§āĻ āϏāĻžāĻāĻ āĻāĻŽāĻžāϝāĻŧāĨ¤
āĻāĻĻāĻžāĻšāϰāĻŖ .dockerignore:
node_modules
.git
*.log
distā§Š. āĻāύā§āϏāĻā§āϰāĻžāĻāĻļāύā§āϰ āĻā§āϰāĻŽāĻžāύā§āϏāϰāĻŖ (Order Matters) â
āĻĄāĻāĻžāϰ āĻŦāĻŋāϞā§āĻĄ āĻāϰāĻžāϰ āϏāĻŽā§ āϞā§āϝāĻŧāĻžāϰ āĻā§āϝāĻžāĻļāĻŋāĻ (Caching) āĻŦā§āϝāĻŦāĻšāĻžāϰ āĻāϰā§āĨ¤ āϝ⧠āĻĢāĻžāĻāϞāĻā§āϞ⧠āĻāύāĻāύ āĻĒāϰāĻŋāĻŦāϰā§āϤāύ āĻšā§ (āϝā§āĻŽāύ: Source Code), āϏā§āĻā§āϞ⧠Dockerfile-āĻāϰ āύāĻŋāĻā§āϰ āĻĻāĻŋāĻā§ āϰāĻžāĻāĻž āĻāĻāĻŋāϤāĨ¤ āĻāϰ āϝā§āĻā§āϞ⧠āĻĒāϰāĻŋāĻŦāϰā§āϤāύ āĻšā§ āύāĻž (āϝā§āĻŽāύ: Dependency install), āϏā§āĻā§āϞ⧠āĻāĻĒāϰā§āϰ āĻĻāĻŋāĻā§ āϰāĻžāĻāĻž āĻāĻžāϞā§āĨ¤
# āĻāĻžāϞ⧠āĻĒā§āϰā§āϝāĻžāĻāĻāĻŋāϏ: āĻāĻā§ āĻĄāĻŋāĻĒā§āύā§āĻĄā§āύā§āϏāĻŋ āĻāύā§āϏāĻāϞ āĻāϰāĻž
COPY package.json .
RUN npm install
# āĻĒāϰ⧠āϏā§āϰā§āϏ āĻā§āĻĄ āĻāĻĒāĻŋ āĻāϰāĻž
COPY . .ā§Ē. āĻŽāĻžāϞā§āĻāĻŋ-āϏā§āĻā§āĻ āĻŦāĻŋāϞā§āĻĄ (Multi-stage Builds) â
āĻāĻāĻŋ āĻāĻŽā§āĻ āϏāĻžāĻāĻ āĻāĻŽāĻžāύā§āϰ āϏāĻŦāĻā§ā§ā§ āĻāĻžāϰā§āϝāĻāϰ āĻāĻĒāĻžā§āĨ¤ āĻāĻāĻāĻŋ āϏā§āĻā§āĻā§ āĻŦāĻŋāϞā§āĻĄ āĻāϰ⧠āĻ āύā§āϝ āϏā§āĻā§āĻā§ āĻļā§āϧ⧠āĻĒā§āϰā§ā§āĻāύā§ā§ āĻĢāĻžāĻāϞāĻā§āϞ⧠āĻāĻĒāĻŋ āĻāϰ⧠āύā§āĻā§āĻž āĻšā§āĨ¤
# āϏā§āĻā§āĻ ā§§: āĻŦāĻŋāϞā§āĻĄ
FROM node:18 AS builder
WORKDIR /app
COPY . .
RUN npm run build
# āϏā§āĻā§āĻ ā§¨: āϰāĻžāύāĻāĻžāĻāĻŽ (āĻā§āĻŦāĻ āĻā§āĻ āĻāĻŽā§āĻ)
FROM nginx:alpine
COPY --from=builder /app/dist /usr/share/nginx/htmlā§Ģ. āϰā§āĻ āĻāĻāĻāĻžāϰ āĻā§āĻŋā§ā§ āĻāϞāĻž (Don't run as root) â
āύāĻŋāϰāĻžāĻĒāϤā§āϤāĻžāϰ āĻāĻžāϤāĻŋāϰ⧠āĻāύā§āĻā§āĻāύāĻžāϰā§āϰ āĻā§āϤāϰ⧠āĻ ā§āϝāĻžāĻĒā§āϞāĻŋāĻā§āĻļāύāĻāĻŋ āϰā§āĻ āĻāĻāĻāĻžāϰ āĻšāĻŋāϏā§āĻŦā§ āύāĻž āĻāĻžāϞāĻžāύā§āĻ āĻāĻžāϞā§āĨ¤ āĻāϰ āĻĒāϰāĻŋāĻŦāϰā§āϤ⧠āĻāĻāĻāĻŋ āĻāĻžāϏā§āĻāĻŽ āĻāĻāĻāĻžāϰ āϤā§āϰāĻŋ āĻāϰ⧠āϏā§āĻāĻŋ āĻŦā§āϝāĻŦāĻšāĻžāϰ āĻāϰā§āύāĨ¤
RUN addgroup -S appgroup && adduser -S appuser -G appgroup
USER appuserā§Ŧ. āύāĻŋāϰā§āĻĻāĻŋāώā§āĻ āĻā§āϝāĻžāĻ āĻŦā§āϝāĻŦāĻšāĻžāϰ āĻāϰāĻž (Use Specific Tags) â
āϏāĻŦāϏāĻŽā§ āĻŦā§āϏ āĻāĻŽā§āĻā§āϰ āĻāĻāĻāĻŋ āύāĻŋāϰā§āĻĻāĻŋāώā§āĻ āĻāĻžāϰā§āϏāύ āĻŦā§āϝāĻŦāĻšāĻžāϰ āĻāϰā§āύāĨ¤ latest āĻā§āϝāĻžāĻ āĻŦā§āϝāĻŦāĻšāĻžāϰ āĻāϰāϞ⧠āĻāĻŦāĻŋāώā§āϝāϤ⧠āĻŦāĻŋāϞā§āĻĄā§ āϏāĻŽāϏā§āϝāĻž āĻšāϤ⧠āĻĒāĻžāϰā§āĨ¤
- āĻŦāϰā§āĻāύ āĻāϰā§āύ:
FROM node:latest - āĻā§āϰāĻšāĻŖ āĻāϰā§āύ:
FROM node:18-alpine
ā§. COPY āĻŦāύāĻžāĻŽ ADD â
āĻĢāĻžāĻāϞ āĻāĻĒāĻŋ āĻāϰāĻžāϰ āĻāύā§āϝ āϏāĻŦāϏāĻŽā§ COPY āĻŦā§āϝāĻŦāĻšāĻžāϰ āĻāϰāĻžāϰ āĻā§āώā§āĻāĻž āĻāϰā§āύāĨ¤ ADD āĻļā§āϧā§āĻŽāĻžāϤā§āϰ āϤāĻāύāĻ āĻŦā§āϝāĻŦāĻšāĻžāϰ āĻāϰā§āύ āϝāĻāύ āĻāĻĒāύāĻžāϰ āĻā§āύ⧠URL āĻĨā§āĻā§ āĻĢāĻžāĻāϞ āĻĄāĻžāĻāύāϞā§āĻĄ āĻāϰāĻž āĻŦāĻž āĻāĻŋāĻĒ āĻĢāĻžāĻāϞ āĻāĻā§āϏāĻā§āϰāĻžāĻā§āĻ āĻāϰāĻž āĻĒā§āϰā§ā§āĻāύāĨ¤ COPY āĻ
āύā§āĻ āĻŦā§āĻļāĻŋ āϏā§āĻŦāĻā§āĻ āĻāĻŦāĻ āύāĻŋāϰāĻžāĻĒāĻĻāĨ¤
ā§Ž. āĻā§āĻ āĻŦā§āϏ āĻāĻŽā§āĻ āύāĻŋāϰā§āĻŦāĻžāĻāύ (Small Base Images) â
āĻāĻŽā§āĻā§āϰ āϏāĻžāĻāĻ āĻā§āĻ āϰāĻžāĻāϤ⧠alpine āĻŦāĻž slim āĻāĻžāϰā§āϏāύāĻā§āϞ⧠āĻŦā§āϝāĻŦāĻšāĻžāϰ āĻāϰā§āύāĨ¤ āĻāĻā§āϞ⧠āϏāĻžāϧāĻžāϰāĻŖāϤ ā§Ģ-ā§§ā§Ļ MB āĻšāϝāĻŧ, āϝā§āĻāĻžāύ⧠āϏāĻžāϧāĻžāϰāĻŖ āĻāĻŽā§āĻ āĻļāϤ āĻļāϤ āĻŽā§āĻāĻžāĻŦāĻžāĻāĻ āĻšāϤ⧠āĻĒāĻžāϰā§āĨ¤
āϏāĻžāϰāϏāĻāĻā§āώā§āĻĒ (Quick Checklist) â
- [x] āϞā§āϝāĻŧāĻžāϰ āϏāĻāĻā§āϝāĻž āĻāĻŽāĻžāύā§āϰ āĻāύā§āϝ āĻāĻŽāĻžāύā§āĻĄ āĻāĻŽā§āĻŦāĻžāĻāύ āĻāϰāĻžāĨ¤
- [x] āĻ āĻĒā§āϰā§ā§āĻāύā§āϝāĻŧ āĻĢāĻžāĻāϞ āĻĄāĻŋāϞāĻŋāĻ āĻāϰāĻž (āĻāĻāĻ āϞā§āϝāĻŧāĻžāϰā§)āĨ¤
- [x]
.dockerignoreāĻŦā§āϝāĻŦāĻšāĻžāϰ āĻāϰāĻžāĨ¤ - [x] āĻŽāĻžāϞā§āĻāĻŋ-āϏā§āĻā§āĻ āĻŦāĻŋāϞā§āĻĄ āĻŦā§āϝāĻŦāĻšāĻžāϰ āĻāϰāĻžāĨ¤
- [x] āύāύ-āϰā§āĻ āĻāĻāĻāĻžāϰ āĻŦā§āϝāĻŦāĻšāĻžāϰ āĻāϰāĻžāĨ¤
IMPORTANT
āĻŽāύ⧠āϰāĻžāĻāĻŦā§āύ, āĻā§āĻ āĻāĻŽā§āĻ āĻŽāĻžāύā§āĻ āĻĻā§āϰā§āϤ āĻĄāĻŋāĻĒā§āϞā§āĻŽā§āύā§āĻ āĻāĻŦāĻ āĻāĻŽ āϏā§āĻā§āϰā§āĻ āĻāϰāĻ!