چند نکته درباره Dockerfile۱. بدون دسترسی روت:
- اجرای کانتینر با کاربر غیر روت برای امنیت بیشتر
۲. ساخت چند مرحلهای (Multistage Build):
- کاهش حجم نهایی ایمیج
- جداسازی محیط build از محیط اجرا
مثال:
FROM golang:1.23 AS build
WORKDIR /src
COPY main.go .
RUN go build -o /bin/hello ./main.go
FROM scratch
COPY --from=build /bin/hello /bin/hello
CMD ["/bin/hello"]
۳. استفاده از Distroless یا From Scratch:
- حذف ابزارهای غیرضروری برای کاهش سطح حمله
- استفاده از ایمیجهای پایه حداقلی
مثال:
FROM gcr.io/distroless/nodejs
COPY --from=builder /app/dist .
CMD ["app.js"]
۴. استفاده از ایمیجهای مطمئن:
- استفاده از ایمیجهای رسمی از Docker Hub
- بررسی منبع و تاریخچه ایمیجها
۵. بهروزرسانی منظم ایمیج:
- بهروزرسانی مرتب پایه ایمیج برای دریافت پچهای امنیتی
- استفاده از CI/CD برای ساخت خودکار ایمیجهای جدید
۶. پورتهای در معرض (Exposed Ports):
- فقط پورتهای ضروری را expose کنید
- مستندسازی پورتهای مورد نیاز
مثال:
EXPOSE 8080
۷. عدم قرار دادن کلیدها و رمزها در Dockerfile
- استفاده از secrets یا متغیرهای محیطی
مثال:
# bad idea
ENV DB_PASSWORD=secretpass
# recommended
ARG DB_PASSWORD
۸. مدیریت لایهها (Layer Sanity):
- ترکیب دستورات مرتبط برای کاهش تعداد لایهها
- حذف فایلهای موقت در همان لایه
مثال:
RUN apt-get update && \
apt-get install -y package1 package2 && \
rm -rf /var/lib/apt/lists/*
۹. برچسبهای متادیتا:
- افزودن اطلاعات مفید درباره ایمیج
مثال:
LABEL maintainer="email@example.com"
LABEL version="1.0"
LABEL description="Application description"
نکات تکمیلی:
- همیشه از .dockerignore برای ایگنور شدن فایلهای غیرضروری استفاده کنید
- دستورات را به ترتیب بهینه قرار دهید (از کمترین تغییر به بیشترین)
- از کش Docker به درستی استفاده کنید
#docker@Syntax_fa