Skip to content

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
  • āϏāĻ āĻŋāĻ• āĻĒāĻĻā§āϧāϤāĻŋ: āĻāĻ•āĻžāϧāĻŋāĻ• āĻ•āĻŽāĻžāĻ¨ā§āĻĄāϕ⧇ && āĻĻāĻŋā§Ÿā§‡ āϝ⧁āĻ•ā§āϤ āĻ•āϰ⧁āύāĨ¤
    dockerfile
    RUN apt-get update && apt-get install -y \
        git \
        curl \
        && rm -rf /var/lib/apt/lists/*

⧍. .dockerignore āĻŦā§āϝāĻŦāĻšāĻžāϰ āĻ•āϰāĻž ​

āĻŦāĻŋāĻ˛ā§āĻĄ āĻ•āĻ¨ā§āĻŸā§‡āĻ•ā§āϏāϟ (Build Context) āĻĨ⧇āϕ⧇ āĻ…āĻĒā§āĻ°ā§Ÿā§‹āϜāύ⧀āϝāĻŧ āĻĢāĻžāχāϞ (āϝ⧇āĻŽāύ: node_modules, .git, āϞ⧋āĻ— āĻĢāĻžāχāϞ) āĻŦāĻžāĻĻ āĻĻ⧇āĻ“ā§ŸāĻžāϰ āϜāĻ¨ā§āϝ .dockerignore āĻĢāĻžāχāϞ āĻŦā§āϝāĻŦāĻšāĻžāϰ āĻ•āϰ⧁āύāĨ¤ āĻāϟāĻŋ āĻŦāĻŋāĻ˛ā§āĻĄ āĻĒā§āϰāϏ⧇āϏ āĻĻā§āϰ⧁āϤ āĻ•āϰ⧇ āĻāĻŦāĻ‚ āχāĻŽā§‡āϜ āϏāĻžāχāϜ āĻ•āĻŽāĻžāϝāĻŧāĨ¤

āωāĻĻāĻžāĻšāϰāĻŖ .dockerignore:

text
node_modules
.git
*.log
dist

ā§Š. āχāĻ¨ā§āϏāĻŸā§āϰāĻžāĻ•āĻļāύ⧇āϰ āĻ•ā§āϰāĻŽāĻžāύ⧁āϏāϰāĻŖ (Order Matters) ​

āĻĄāĻ•āĻžāϰ āĻŦāĻŋāĻ˛ā§āĻĄ āĻ•āϰāĻžāϰ āϏāĻŽā§Ÿ āϞ⧇āϝāĻŧāĻžāϰ āĻ•ā§āϝāĻžāĻļāĻŋāĻ‚ (Caching) āĻŦā§āϝāĻŦāĻšāĻžāϰ āĻ•āϰ⧇āĨ¤ āϝ⧇ āĻĢāĻžāχāϞāϗ⧁āϞ⧋ āϘāύāϘāύ āĻĒāϰāĻŋāĻŦāĻ°ā§āϤāύ āĻšā§Ÿ (āϝ⧇āĻŽāύ: Source Code), āϏ⧇āϗ⧁āϞ⧋ Dockerfile-āĻāϰ āύāĻŋāĻšā§‡āϰ āĻĻāĻŋāϕ⧇ āϰāĻžāĻ–āĻž āωāϚāĻŋāϤāĨ¤ āφāϰ āϝ⧇āϗ⧁āϞ⧋ āĻĒāϰāĻŋāĻŦāĻ°ā§āϤāύ āĻšā§Ÿ āύāĻž (āϝ⧇āĻŽāύ: Dependency install), āϏ⧇āϗ⧁āϞ⧋ āωāĻĒāϰ⧇āϰ āĻĻāĻŋāϕ⧇ āϰāĻžāĻ–āĻž āĻ­āĻžāϞ⧋āĨ¤

dockerfile
# āĻ­āĻžāϞ⧋ āĻĒā§āĻ°ā§āϝāĻžāĻ•āϟāĻŋāϏ: āφāϗ⧇ āĻĄāĻŋāĻĒ⧇āĻ¨ā§āĻĄā§‡āĻ¨ā§āϏāĻŋ āχāĻ¨ā§āϏāϟāϞ āĻ•āϰāĻž
COPY package.json .
RUN npm install

# āĻĒāϰ⧇ āϏ⧋āĻ°ā§āϏ āϕ⧋āĻĄ āĻ•āĻĒāĻŋ āĻ•āϰāĻž
COPY . .

ā§Ē. āĻŽāĻžāĻ˛ā§āϟāĻŋ-āĻ¸ā§āĻŸā§‡āϜ āĻŦāĻŋāĻ˛ā§āĻĄ (Multi-stage Builds) ​

āĻāϟāĻŋ āχāĻŽā§‡āϜ āϏāĻžāχāϜ āĻ•āĻŽāĻžāύ⧋āϰ āϏāĻŦāĻšā§‡ā§Ÿā§‡ āĻ•āĻžāĻ°ā§āϝāĻ•āϰ āωāĻĒāĻžā§ŸāĨ¤ āĻāĻ•āϟāĻŋ āĻ¸ā§āĻŸā§‡āĻœā§‡ āĻŦāĻŋāĻ˛ā§āĻĄ āĻ•āϰ⧇ āĻ…āĻ¨ā§āϝ āĻ¸ā§āĻŸā§‡āĻœā§‡ āĻļ⧁āϧ⧁ āĻĒā§āĻ°ā§Ÿā§‹āϜāĻ¨ā§€ā§Ÿ āĻĢāĻžāχāϞāϗ⧁āϞ⧋ āĻ•āĻĒāĻŋ āĻ•āϰ⧇ āύ⧇āĻ“ā§ŸāĻž āĻšā§ŸāĨ¤

dockerfile
# āĻ¸ā§āĻŸā§‡āϜ ā§§: āĻŦāĻŋāĻ˛ā§āĻĄ
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) ​

āύāĻŋāϰāĻžāĻĒāĻ¤ā§āϤāĻžāϰ āĻ–āĻžāϤāĻŋāϰ⧇ āĻ•āĻ¨ā§āĻŸā§‡āχāύāĻžāϰ⧇āϰ āϭ⧇āϤāϰ⧇ āĻ…ā§āϝāĻžāĻĒā§āϞāĻŋāϕ⧇āĻļāύāϟāĻŋ āϰ⧁āϟ āχāωāϜāĻžāϰ āĻšāĻŋāϏ⧇āĻŦ⧇ āύāĻž āϚāĻžāϞāĻžāύ⧋āχ āĻ­āĻžāϞ⧋āĨ¤ āĻāϰ āĻĒāϰāĻŋāĻŦāĻ°ā§āϤ⧇ āĻāĻ•āϟāĻŋ āĻ•āĻžāĻ¸ā§āϟāĻŽ āχāωāϜāĻžāϰ āϤ⧈āϰāĻŋ āĻ•āϰ⧇ āϏ⧇āϟāĻŋ āĻŦā§āϝāĻŦāĻšāĻžāϰ āĻ•āϰ⧁āύāĨ¤

dockerfile
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

āĻŽāύ⧇ āϰāĻžāĻ–āĻŦ⧇āύ, āϛ⧋āϟ āχāĻŽā§‡āϜ āĻŽāĻžāύ⧇āχ āĻĻā§āϰ⧁āϤ āĻĄāĻŋāĻĒā§āϞ⧟āĻŽā§‡āĻ¨ā§āϟ āĻāĻŦāĻ‚ āĻ•āĻŽ āĻ¸ā§āĻŸā§‹āϰ⧇āϜ āĻ–āϰāϚ!

Released under the MIT License.