عنوان:

‫خداحافظی با Dockerfile در دات‌نت ۱۰ با کانتینرسازی بومی (Native Containerization)


نویسنده: وحید نصیری
تاریخ: ۱۴۰۴/۰۹/۱۰ ۱۲:۴۸
آدرس: www.dntips.ir
با عرضهٔ .NET 10، یکی از بزرگ‌ترین دردسرهای توسعه‌دهندگان دات‌نت برای همیشه حل شد: دیگر نیازی به نوشتن و نگهداری Dockerfile نیست! حالا می‌توانید فقط با یک دستور ساده از داخل SDK دات‌نت، تصویر کانتینر کاملاً سازگار با استاندارد OCI بسازید؛ بدون نیاز به نصب Docker daemon و بدون هیچ فایل متنی اضافی.

مسئلهٔ قدیمی: وابستگی به Dockerfile و Docker Daemon
تا پیش از این، برای کانتینری کردن یک برنامهٔ کنسولی یا میکروسرویس دات‌نت معمولاً این مراحل را طی می‌کردیم:
  • نوشتن یک Dockerfile چند مرحله‌ای (multi-stage)
  • نصب Docker Desktop یا Docker Engine روی ماشین توسعه یا سرور CI
  • اجرای docker build که زمان‌بر بود و گاهی خطاهای عجیبی می‌داد
  • مدیریت تفاوت‌های محیط توسعه ویندوز و لینوکس
  • به‌روزرسانی مداوم Dockerfile با تغییر ورژن SDK یا runtime
این روند برای توسعه‌دهندگان تازه‌کار دات‌نت، به‌خصوص کسانی که فقط یک ابزار CLI یا سرویس کوچک می‌نوشتند، واقعاً آزاردهنده بود.

راه‌حل قدیمی: Dockerfile کلاسیک
# مثال معمول Dockerfile برای یک برنامه کنسولی
FROM mcr.microsoft.com/dotnet/sdk:10.0 AS build
WORKDIR /src
COPY . .
RUN dotnet publish -c Release -o /app/publish

FROM mcr.microsoft.com/dotnet/runtime:10.0
WORKDIR /app
COPY --from=build /app/publish .
ENTRYPOINT ["dotnet", "MyConsoleApp.dll"]
هر بار که ورژن دات‌نت عوض می‌شد یا می‌خواستید از self-contained استفاده کنید، باید این فایل را دستی ویرایش می‌کردید.

راه‌حل جدید در .NET 10: کانتینرسازی بومی با یک دستور!
حالا کافی است این یک خط دستور را اجرا کنید:
dotnet publish -r linux-x64 /p:PublishProfile=DefaultContainer
این دستور چه کار می‌کند؟
  • برنامه را با تنظیمات Release کامپایل می‌کند
  • به صورت خودکار از runtime image مناسب (distroless یا minimal) استفاده می‌کند
  • یک تصویر OCI کاملاً استاندارد می‌سازد (همان فرمتی که Docker و Podman و containerd می‌فهمند)
  • تصویر را در رجیستری محلی ذخیره می‌کند (مثل وقتی docker build می‌زنید)

برای دیدن تصویر ساخته‌شده:
docker images | grep myapp
# یا اگر از Podman استفاده می‌کنید
podman images | grep myapp

و برای اجرای مستقیم:
docker run --rm myapp:defaultcontainer

گزینه‌های مفید اضافی:
# ساخت تصویر با تگ دلخواه
dotnet publish /p:PublishProfile=DefaultContainer /p:ContainerImageTag=myapp-v1.2.0

# استفاده از base image دلخواه (مثلاً wolfi یا distroless)
dotnet publish /p:PublishProfile=DefaultContainer /p:ContainerBaseImage=mcr.microsoft.com/dotnet/nightly/runtime-deps:10.0

# تولید چند معماری همزمان (multi-arch)
dotnet publish -r linux-x64 -r linux-arm64 /p:PublishProfile=DefaultContainer /p:ContainerCreateManifest=true

مزایای واقعی در عمل
مزیتتوضیح
سرعت ساخت بسیار بالاتردیگر نیازی به لایه‌های build نیست؛ مستقیم از SDK تصویر ساخته می‌شود
عدم نیاز به Docker daemonروی ماشین‌های بدون Docker (مثل سرورهای لینوکس بدون root) هم کار می‌کند
یکپارچگی کامل با CI/CDدر GitHub Actions، GitLab CI، Azure DevOps فقط یک stage ساده کافی است
پشتیبانی Day-0 از ابرهاAWS، Azure، GCP، Heroku، Fly.io، Render و … همه از این تصاویر پشتیبانی می‌کنند
حجم تصویر بهینه‌تربه صورت پیش‌فرض از distroless یا chiseled images استفاده می‌کند
نتیجه‌گیری
.NET 10 با ویژگی Native Containerization واقعاً یک انقلاب کوچک اما بسیار کاربردی ایجاد کرد. دیگر بهانه‌ای برای ننوشتن کانتینر برای ابزارهای CLI، میکروسرویس‌ها یا حتی برنامه‌های آزمایشی نداریم. یک دستور، یک تصویر استاندارد، بدون دردسر. از امروز به بعد، وقتی کسی بپرسد «چطور برنامه‌ام رو کانتینری کنم؟»، جواب خیلی ساده است:
فقط dotnet publish /p:PublishProfile=DefaultContainer بزن!


مشاهده مطلب اصلی