لینوکس برای توسعهدهندگان داتنت: از ویندوز تا کراس-پلتفرم؛ بخش سوم: دیپلوی و اجرای برنامههای داتنت روی لینوکس
نویسنده: وحید نصیری
تاریخ: ۱۴۰۴/۰۴/۲۷ ۰۸:۰۵
آدرس: www.dntips.ir
| مطالب | ۳۶۹۴ |
| نویسندگان | ۲۷۶ |
| گروههای مطالب | ۱۰۲۴ |
| نقشههای راه | ۱۱۹ |
| دورهها | ۱۴ |
| اشتراکها | ۱۷۹۱۴ |
dotnet publish استفاده میکنید، باید تصمیم بگیرید که خروجی شما چگونه باشد. هر مدل مزایا و معایب خاص خود را دارد.dotnet publish -c Release
dotnet YourApp.dll
dotnet publish -c Release --self-contained -r linux-x64
chmod +x ./YourApp ./YourApp
# مثال با مدل Self-Contained dotnet publish -c Release --self-contained -r linux-x64 -p:PublishReadyToRun=true
# مثال با هر دو بهینهسازی dotnet publish -c Release --self-contained -r linux-x64 -p:PublishReadyToRun=true -p:PublishSingleFile=true
./YourApp) فقط برای تست مناسب است. اگر ترمینال را ببندید، برنامه متوقف میشود. در محیط پروداکشن، اپلیکیشن شما باید به عنوان یک سرویس (یا Daemon) در پسزمینه اجرا شود تا همیشه فعال بماند و در صورت ریاستارت شدن سرور، به طور خودکار اجرا شود.systemd است.systemd:sudo nano /etc/systemd/system/kestrel-myapp.service
[Unit] Description=My Cool ASP.NET Core App running on Linux [Service] # مسیر پوشهای که فایلهای منتشر شدهی برنامه در آن قرار دارد WorkingDirectory=/var/www/myapp # دستوری که برای اجرای برنامه استفاده میشود # اگر از مدل Self-Contained استفاده کردید: ExecStart=/var/www/myapp/YourApp # اگر از مدل Framework-Dependent استفاده کردید: ExecStart=/usr/bin/dotnet /var/www/myapp/YourApp.dll ExecStart=/var/www/myapp/YourApp # سرویس همیشه باید ریاستارت شود، مگر اینکه به صورت دستی متوقف شود Restart=always # زمان انتظار قبل از ریاستارت در صورت بروز خطا (به ثانیه) RestartSec=10 # کاربر و گروهی که برنامه با دسترسی آنها اجرا میشود (برای امنیت بیشتر) User=www-data Group=www-data # متغیرهای محیطی مورد نیاز برنامه (مثلاً برای حالت پروداکشن) Environment=ASPNETCORE_ENVIRONMENT=Production Environment=DOTNET_PRINT_TELEMETRY_MESSAGE=false [Install] WantedBy=multi-user.target
systemctl:sudo systemctl daemon-reloadsudo systemctl enable kestrel-myapp.servicesudo systemctl start kestrel-myapp.servicesudo systemctl status kestrel-myapp.servicesudo journalctl -fu kestrel-myapp.serviceDockerfile، میتوانید ایمیج برنامه را بارها و بارها به صورت خودکار بسازید.Dockerfile بهینهDockerfile (بدون پسوند) بسازید و محتوای زیر را در آن قرار دهید. این فایل از تکنیک Multi-stage builds استفاده میکند که حجم ایمیج نهایی را به شدت کاهش میدهد.# ----- مرحله ۱: بیلد کردن برنامه (استفاده از ایمیج کامل SDK) ----- # از ایمیج رسمی .NET SDK به عنوان پایهی بیلد استفاده میکنیم FROM mcr.microsoft.com/dotnet/sdk:8.0 AS build-env WORKDIR /app # فایلهای پروژه را کپی میکنیم COPY *.csproj ./ # پکیجهای نوگت را ریستور میکنیم RUN dotnet restore # تمام سورس کد را کپی میکنیم COPY . ./ # برنامه را در حالت Release پابلیش میکنیم RUN dotnet publish -c Release -o out # ----- مرحله ۲: ساخت ایمیج نهایی (استفاده از ایمیج سبک Runtime) ----- # از ایمیج سبک ASP.NET Runtime استفاده میکنیم که برای اجرای برنامه کافی است FROM mcr.microsoft.com/dotnet/aspnet:8.0 WORKDIR /app # فایلهای پابلیش شده از مرحلهی بیلد را به این مرحله کپی میکنیم COPY --from=build-env /app/out . # مشخص میکنیم که برنامه روی کدام پورت داخل کانتینر گوش میدهد EXPOSE 8080 # نقطهی ورود یا دستوری که با اجرای کانتینر باید اجرا شود ENTRYPOINT ["dotnet", "YourApp.dll"]
docker build -t my-webapp .-t my-webapp یک تگ یا نام برای ایمیج شما مشخص میکند)docker run -d -p 8080:8080 my-webapp-d: اجرای کانتینر در حالت detached (در پسزمینه).-p 8080:8080: پورت 8080 سیستم میزبان (Host) را به پورت 8080 کانتینر متصل (map) میکند. حالا با مراجعه به http://localhost:8080 میتوانید اپلیکیشن را ببینید.