Dockerfile فایلی است که دستورات ساخت یک Docker Image را مشخص میکند. نوشتن یک Dockerfile بهینه میتواند تاثیر زیادی در سرعت بیلد، حجم Image و امنیت داشته باشد. در این مقاله، بهترین شیوههای نوشتن Dockerfile را بررسی میکنیم.
۱. استفاده از Base Image رسمی و سبک
همیشه از Imageهای رسمی و سبکوزن استفاده کنید. نسخههای Alpine معمولا بسیار کوچکتر هستند.
FROM ubuntu:latest
RUN apt-get update
RUN apt-get install -y nodejs npmحجم: ~900MB
FROM node:20-alpineحجم: ~130MB
۲. ترتیب دستورات برای بهینهسازی Cache
Docker برای هر دستور یک Layer میسازد. دستوراتی که کمتر تغییر میکنند را اول بنویسید تا از Cache استفاده شود.
# اول وابستگیها (کمتر تغییر میکند)
COPY package*.json ./
RUN npm ci
# بعد کد اپلیکیشن (بیشتر تغییر میکند)
COPY . .
RUN npm run build۳. استفاده از Multi-stage Builds
با Multi-stage Builds میتوانید فایل نهایی را بدون ابزارهای بیلد بسازید و حجم را کاهش دهید.
# Stage 1: Build
FROM node:20-alpine AS builder
WORKDIR /app
COPY package*.json ./
RUN npm ci
COPY . .
RUN npm run build
# Stage 2: Production
FROM node:20-alpine
WORKDIR /app
COPY --from=builder /app/dist ./dist
COPY --from=builder /app/node_modules ./node_modules
CMD ["node", "dist/main.js"]۴. استفاده از .dockerignore
فایلهای غیرضروری را از Context حذف کنید تا سرعت بیلد افزایش یابد.
node_modules
npm-debug.log
.git
.env
*.md
Dockerfile
.dockerignore
dist
coverage۵. اجرا با کاربر غیر-root
برای امنیت بیشتر، اپلیکیشن را با کاربر معمولی اجرا کنید.
FROM node:20-alpine
# ایجاد کاربر
RUN addgroup -S appgroup && adduser -S appuser -G appgroup
WORKDIR /app
COPY --chown=appuser:appgroup . .
# تغییر به کاربر معمولی
USER appuser
CMD ["node", "app.js"]هشدار امنیتی
هرگز اطلاعات حساس مانند رمز عبور یا کلیدهای API را در Dockerfile قرار ندهید. از متغیرهای محیطی یا Docker Secrets استفاده کنید.
چکلیست نهایی
- از Base Image سبک استفاده کنید (Alpine)
- وابستگیها را قبل از کد کپی کنید
- از Multi-stage Builds استفاده کنید
- فایل .dockerignore ایجاد کنید
- با کاربر غیر-root اجرا کنید
- دستورات RUN را ترکیب کنید
- از COPY به جای ADD استفاده کنید
- Image را با اسکنرهای امنیتی بررسی کنید
آماده دیپلوی هستید؟
Docker Image خود را در زیرساخت ابری بونرا دیپلوی کنید.