برنامه نویسی

بهترین روش های Dockerfile: نوشتن تصاویر Docker کارآمد و ایمن

Summarize this content to 400 words in Persian Lang
Docker به توسعه دهندگان اجازه می دهد تا برنامه ها را با وابستگی های خود در یک ظرف سبک وزن و قابل حمل بسته بندی کنند. با این حال، ایجاد تصاویر Docker کارآمد و ایمن بسیار مهم است، به خصوص در محیط های تولیدی که در آن عملکرد و امنیت در اولویت هستند. در این مقاله، بهترین روش‌ها را بررسی می‌کنیم تا به شما در نوشتن Dockerfiles بهینه و ایمن کمک کند، و مطمئن شوید که کانتینرهای شما کوچک، سریع و قوی هستند.

I. تصویر پایه مناسب را انتخاب کنید

تصویر پایه پایه ظرف شما را تنظیم می کند. انتخاب یک تصویر پایه سبک می تواند اندازه تصویر شما را به میزان قابل توجهی کاهش دهد و آسیب پذیری های امنیتی را به حداقل برساند.

در صورت امکان از تصاویر رسمی Docker استفاده کنید، زیرا آنها نگهداری می شوند و به طور منظم به روز می شوند.
تصاویر سبک وزن مانند آلپاین را به تصاویر کامل سیستم عامل مانند اوبونتو یا دبیان ترجیح دهید. Alpine فقط حدود 5 مگابایت است در مقایسه با 100+ مگابایت برای اوبونتو: FROM node:20-alpine

II. از ساخت های چند مرحله ای برای تصاویر کوچکتر استفاده کنید

ساخت‌های چند مرحله‌ای به شما این امکان را می‌دهند که محیط ساخت را از تصویر تولید نهایی جدا کنید و مطمئن شوید که تصویر نهایی فقط حاوی فایل‌های زمان اجرا لازم است. این به کاهش اندازه تصویر و حذف وابستگی های زمان ساخت کمک می کند.

از ساخت های چند مرحله ای برای کامپایل یا ساخت برنامه خود در یک مرحله استفاده کنید و فقط مصنوعات لازم را در مرحله بعدی کپی کنید.

III. به حداقل رساندن لایه ها

هر دستور در Dockerfile یک لایه جدید به تصویر نهایی اضافه می کند. کاهش تعداد لایه ها و یکپارچه سازی دستورات می تواند منجر به یک تصویر کارآمدتر شود.

چندگانه را با هم ترکیب کنید RUN دستورات در یک لایه
از افزودن فایل های غیر ضروری به تصویر خودداری کنید.

# Instead of this:
RUN apt-get update
RUN apt-get install -y curl
RUN apt-get clean

# Use this:
RUN apt-get update && \
apt-get install -y curl && \
apt-get clean

وارد حالت تمام صفحه شوید

از حالت تمام صفحه خارج شوید

IV. از .dockerignore استفاده کنید

درست مثل .gitignore، .dockerignore به حذف فایل‌های غیرضروری از تصویر Docker کمک می‌کند، اندازه آن را کاهش می‌دهد و از گنجاندن فایل‌های حساس (مانند فایل‌های env یا دایرکتوری‌های Git) در زمینه ساخت جلوگیری می‌کند. اضافه کردن فایل های غیر ضروری مانند اسناد، .git دایرکتوری ها و فایل های پیکربندی محلی به .dockerignore.

# .dockerignore
node_modules
.git
.env
README.md

وارد حالت تمام صفحه شوید

از حالت تمام صفحه خارج شوید

V. مجوزهای کاربر را تنظیم کنید

به‌طور پیش‌فرض، کانتینرهای Docker به‌عنوان کاربر اصلی اجرا می‌شوند که می‌تواند خطرات امنیتی ایجاد کند. این یک تمرین خوب است که تا جایی که ممکن است کانتینرهای خود را با یک کاربر غیر ریشه اجرا کنید.

از دستورالعمل USER برای تغییر به یک کاربر غیر ریشه استفاده کنید.
اگر کاربر در تصویر پایه وجود ندارد، در Dockerfile یک کاربر ایجاد کنید.

# Add a user and switch to it
RUN addgroup -S appgroup && adduser -S appuser -G appgroup
USER appuser

CMD [“./myapp”]

وارد حالت تمام صفحه شوید

از حالت تمام صفحه خارج شوید

VI. بهینه سازی ذخیره سازی با آرگومان های ساخت

داکر در طول فرآیند ساخت، هر لایه را کش می‌کند، که می‌تواند سرعت ساخت‌های بعدی را افزایش دهد. با این حال، کش نامناسب می‌تواند به وابستگی‌های قدیمی یا ساخت‌های ناکارآمد منجر شود. استفاده از آرگومان های ساخت می تواند به کنترل زمانی که کش باید باطل شود کمک کند.

اضافه کردن دستورات متداول در حال تغییر (به عنوان مثال، COPY برای کد منبع) پس از موارد پایدارتر (مانند نصب وابستگی). به عنوان مثال:

# First install dependencies (cacheable)
COPY package.json .
RUN npm install

# Then add source code (likely to change)
COPY . .

CMD [“npm”, “start”]

وارد حالت تمام صفحه شوید

از حالت تمام صفحه خارج شوید

با کپی کردن package.json فایل قبل از کد منبع، به داکر اجازه می‌دهید لایه وابستگی‌ها را کش کند و در زمان بازسازی‌ها صرفه‌جویی کند.

VII. از ابزار رسمی اسکن تصویر Docker استفاده کنید

تصاویر داکر می توانند دارای آسیب پذیری های امنیتی باشند. به طور مرتب تصاویر خود را با استفاده از ابزارهایی مانند Docker Scan یا AWS ECR Image Scanning برای شناسایی و رفع مشکلات احتمالی اسکن کنید.

اسکن امنیتی را در خط لوله CI/CD خود ادغام کنید تا آسیب‌پذیری‌ها را زودتر شناسایی کنید.
از ابزارهایی مانند Docker Scan استفاده کنید.

هشتم. از اسرار کدگذاری سخت خودداری کنید

از افزودن اطلاعات حساس (مانند کلیدهای API، رمز عبور یا توکن ها) به طور مستقیم به Dockerfile خود اجتناب کنید. در عوض، آنها را با استفاده از متغیرهای محیطی یا Docker Secrets به طور ایمن منتقل کنید.

استفاده کنید ARG و ENV برای پیکربندی های پویا، اما مطمئن شوید که آنها به طور ایمن ارسال می شوند.
از Docker Secrets یا سایر ابزارهای مدیریت مخفی برای استقرار تولید استفاده کنید.

ARG API_KEY
ENV API_KEY=$API_KEY

وارد حالت تمام صفحه شوید

از حالت تمام صفحه خارج شوید

IX بعد از نصب Dependencies پاک کنید

پس از نصب بسته‌ها یا وابستگی‌ها، مطمئن شوید که فایل‌های موقت و حافظه پنهان را پاکسازی کرده‌اید تا تصویر نازک بماند.

استفاده کنید apt-get clean یا دستورات معادل برای سایر مدیران بسته.
پس از نصب فایل های موقت را حذف کنید.

RUN apt-get update && \
apt-get install -y curl && \
apt-get clean && \
rm -rf /var/lib/apt/lists/*

وارد حالت تمام صفحه شوید

از حالت تمام صفحه خارج شوید

X. از COPY به جای ADD استفاده کنید

در حالی که ADD می تواند برای کپی فایل ها و واکشی URL های راه دور استفاده شود، استفاده از آن ایمن تر و واضح تر است. COPY برای انتقال فایل های محلی استفاده کنید ADD فقط زمانی که نیاز به استخراج فایل های tar یا دانلود فایل های راه دور دارید.

استفاده کنید COPY برای فایل های محلی برای جلوگیری از رفتار ناخواسته.
استفاده کنید ADD فقط برای موارد استفاده پیشرفته مانند واکشی فایل های راه دور.

در اینجا یک نمونه Dockerfile آورده شده است که بهترین شیوه ها را در خود جای داده است:

# Stage 1: Build Stage – Using multistage builds for smaller images
FROM node:20-alpine AS builder

# Set working directory
WORKDIR /app

# Install dependencies (cacheable layer)
COPY package.json package-lock.json ./
RUN npm install –production && \
# Clean up npm cache after installing
npm cache clean –force

# Copy source files
COPY . .

# Build the application
RUN npm run build

# Remove dev dependencies and unnecessary files
RUN rm -rf ./src ./tests ./node_modules && \
npm install –production && \
# Clean up any temporary files
npm cache clean –force && \
rm -rf /var/cache/apk/* /tmp/*

# Stage 2: Production Stage – Creating a lightweight final image
FROM node:20-alpine

# Set working directory
WORKDIR /app

# Copy necessary files from build stage
COPY –from=builder /app/dist ./dist
COPY –from=builder /app/node_modules ./node_modules

# Add a non-root user for security
RUN addgroup -S appgroup && adduser -S appuser -G appgroup
USER appuser

# Expose the port the app runs on
EXPOSE 3000

# Start the application
CMD [“node”, “dist/index.js”]

# .dockerignore
node_modules
.git
.env
README.md
Dockerfile

وارد حالت تمام صفحه شوید

از حالت تمام صفحه خارج شوید

Docker به توسعه دهندگان اجازه می دهد تا برنامه ها را با وابستگی های خود در یک ظرف سبک وزن و قابل حمل بسته بندی کنند. با این حال، ایجاد تصاویر Docker کارآمد و ایمن بسیار مهم است، به خصوص در محیط های تولیدی که در آن عملکرد و امنیت در اولویت هستند. در این مقاله، بهترین روش‌ها را بررسی می‌کنیم تا به شما در نوشتن Dockerfiles بهینه و ایمن کمک کند، و مطمئن شوید که کانتینرهای شما کوچک، سریع و قوی هستند.

I. تصویر پایه مناسب را انتخاب کنید

تصویر پایه پایه ظرف شما را تنظیم می کند. انتخاب یک تصویر پایه سبک می تواند اندازه تصویر شما را به میزان قابل توجهی کاهش دهد و آسیب پذیری های امنیتی را به حداقل برساند.

  • در صورت امکان از تصاویر رسمی Docker استفاده کنید، زیرا آنها نگهداری می شوند و به طور منظم به روز می شوند.
  • تصاویر سبک وزن مانند آلپاین را به تصاویر کامل سیستم عامل مانند اوبونتو یا دبیان ترجیح دهید. Alpine فقط حدود 5 مگابایت است در مقایسه با 100+ مگابایت برای اوبونتو: FROM node:20-alpine

II. از ساخت های چند مرحله ای برای تصاویر کوچکتر استفاده کنید

ساخت‌های چند مرحله‌ای به شما این امکان را می‌دهند که محیط ساخت را از تصویر تولید نهایی جدا کنید و مطمئن شوید که تصویر نهایی فقط حاوی فایل‌های زمان اجرا لازم است. این به کاهش اندازه تصویر و حذف وابستگی های زمان ساخت کمک می کند.

  • از ساخت های چند مرحله ای برای کامپایل یا ساخت برنامه خود در یک مرحله استفاده کنید و فقط مصنوعات لازم را در مرحله بعدی کپی کنید.

III. به حداقل رساندن لایه ها

هر دستور در Dockerfile یک لایه جدید به تصویر نهایی اضافه می کند. کاهش تعداد لایه ها و یکپارچه سازی دستورات می تواند منجر به یک تصویر کارآمدتر شود.

  • چندگانه را با هم ترکیب کنید RUN دستورات در یک لایه
  • از افزودن فایل های غیر ضروری به تصویر خودداری کنید.
# Instead of this:
RUN apt-get update
RUN apt-get install -y curl
RUN apt-get clean

# Use this:
RUN apt-get update && \
    apt-get install -y curl && \
    apt-get clean
وارد حالت تمام صفحه شوید

از حالت تمام صفحه خارج شوید

IV. از .dockerignore استفاده کنید

درست مثل .gitignore، .dockerignore به حذف فایل‌های غیرضروری از تصویر Docker کمک می‌کند، اندازه آن را کاهش می‌دهد و از گنجاندن فایل‌های حساس (مانند فایل‌های env یا دایرکتوری‌های Git) در زمینه ساخت جلوگیری می‌کند.
اضافه کردن فایل های غیر ضروری مانند اسناد، .git دایرکتوری ها و فایل های پیکربندی محلی به .dockerignore.

# .dockerignore
node_modules
.git
.env
README.md
وارد حالت تمام صفحه شوید

از حالت تمام صفحه خارج شوید

V. مجوزهای کاربر را تنظیم کنید

به‌طور پیش‌فرض، کانتینرهای Docker به‌عنوان کاربر اصلی اجرا می‌شوند که می‌تواند خطرات امنیتی ایجاد کند. این یک تمرین خوب است که تا جایی که ممکن است کانتینرهای خود را با یک کاربر غیر ریشه اجرا کنید.

  • از دستورالعمل USER برای تغییر به یک کاربر غیر ریشه استفاده کنید.
  • اگر کاربر در تصویر پایه وجود ندارد، در Dockerfile یک کاربر ایجاد کنید.
# Add a user and switch to it
RUN addgroup -S appgroup && adduser -S appuser -G appgroup
USER appuser

CMD ["./myapp"]
وارد حالت تمام صفحه شوید

از حالت تمام صفحه خارج شوید

VI. بهینه سازی ذخیره سازی با آرگومان های ساخت

داکر در طول فرآیند ساخت، هر لایه را کش می‌کند، که می‌تواند سرعت ساخت‌های بعدی را افزایش دهد. با این حال، کش نامناسب می‌تواند به وابستگی‌های قدیمی یا ساخت‌های ناکارآمد منجر شود. استفاده از آرگومان های ساخت می تواند به کنترل زمانی که کش باید باطل شود کمک کند.

  • اضافه کردن دستورات متداول در حال تغییر (به عنوان مثال، COPY برای کد منبع) پس از موارد پایدارتر (مانند نصب وابستگی). به عنوان مثال:
# First install dependencies (cacheable)
COPY package.json .
RUN npm install

# Then add source code (likely to change)
COPY . .

CMD ["npm", "start"]
وارد حالت تمام صفحه شوید

از حالت تمام صفحه خارج شوید

با کپی کردن package.json فایل قبل از کد منبع، به داکر اجازه می‌دهید لایه وابستگی‌ها را کش کند و در زمان بازسازی‌ها صرفه‌جویی کند.

VII. از ابزار رسمی اسکن تصویر Docker استفاده کنید

تصاویر داکر می توانند دارای آسیب پذیری های امنیتی باشند. به طور مرتب تصاویر خود را با استفاده از ابزارهایی مانند Docker Scan یا AWS ECR Image Scanning برای شناسایی و رفع مشکلات احتمالی اسکن کنید.

  • اسکن امنیتی را در خط لوله CI/CD خود ادغام کنید تا آسیب‌پذیری‌ها را زودتر شناسایی کنید.
  • از ابزارهایی مانند Docker Scan استفاده کنید.

هشتم. از اسرار کدگذاری سخت خودداری کنید

از افزودن اطلاعات حساس (مانند کلیدهای API، رمز عبور یا توکن ها) به طور مستقیم به Dockerfile خود اجتناب کنید. در عوض، آنها را با استفاده از متغیرهای محیطی یا Docker Secrets به طور ایمن منتقل کنید.

  • استفاده کنید ARG و ENV برای پیکربندی های پویا، اما مطمئن شوید که آنها به طور ایمن ارسال می شوند.
  • از Docker Secrets یا سایر ابزارهای مدیریت مخفی برای استقرار تولید استفاده کنید.
ARG API_KEY
ENV API_KEY=$API_KEY
وارد حالت تمام صفحه شوید

از حالت تمام صفحه خارج شوید

IX بعد از نصب Dependencies پاک کنید

پس از نصب بسته‌ها یا وابستگی‌ها، مطمئن شوید که فایل‌های موقت و حافظه پنهان را پاکسازی کرده‌اید تا تصویر نازک بماند.

  • استفاده کنید apt-get clean یا دستورات معادل برای سایر مدیران بسته.
  • پس از نصب فایل های موقت را حذف کنید.
RUN apt-get update && \
    apt-get install -y curl && \
    apt-get clean && \
    rm -rf /var/lib/apt/lists/*
وارد حالت تمام صفحه شوید

از حالت تمام صفحه خارج شوید

X. از COPY به جای ADD استفاده کنید

در حالی که ADD می تواند برای کپی فایل ها و واکشی URL های راه دور استفاده شود، استفاده از آن ایمن تر و واضح تر است. COPY برای انتقال فایل های محلی استفاده کنید ADD فقط زمانی که نیاز به استخراج فایل های tar یا دانلود فایل های راه دور دارید.

  • استفاده کنید COPY برای فایل های محلی برای جلوگیری از رفتار ناخواسته.
  • استفاده کنید ADD فقط برای موارد استفاده پیشرفته مانند واکشی فایل های راه دور.

در اینجا یک نمونه Dockerfile آورده شده است که بهترین شیوه ها را در خود جای داده است:

# Stage 1: Build Stage - Using multistage builds for smaller images
FROM node:20-alpine AS builder

# Set working directory
WORKDIR /app

# Install dependencies (cacheable layer)
COPY package.json package-lock.json ./
RUN npm install --production && \
    # Clean up npm cache after installing
    npm cache clean --force

# Copy source files
COPY . .

# Build the application
RUN npm run build

# Remove dev dependencies and unnecessary files
RUN rm -rf ./src ./tests ./node_modules && \
    npm install --production && \
    # Clean up any temporary files
    npm cache clean --force && \
    rm -rf /var/cache/apk/* /tmp/*

# Stage 2: Production Stage - Creating a lightweight final image
FROM node:20-alpine

# Set working directory
WORKDIR /app

# Copy necessary files from build stage
COPY --from=builder /app/dist ./dist
COPY --from=builder /app/node_modules ./node_modules

# Add a non-root user for security
RUN addgroup -S appgroup && adduser -S appuser -G appgroup
USER appuser

# Expose the port the app runs on
EXPOSE 3000

# Start the application
CMD ["node", "dist/index.js"]

# .dockerignore
node_modules
.git
.env
README.md
Dockerfile
وارد حالت تمام صفحه شوید

از حالت تمام صفحه خارج شوید

نوشته های مشابه

دیدگاهتان را بنویسید

نشانی ایمیل شما منتشر نخواهد شد. بخش‌های موردنیاز علامت‌گذاری شده‌اند *

دکمه بازگشت به بالا