Azure
Kif Ikkontenerizzajt l-API tiegħi u Ddeplojjajtha fuq Azure
Dockerfile b'diversi stadji, Docker Compose ma' SQL Server b'health check, u s-Sports Betting API taħdem fuq Azure Container Apps b'Azure SQL warajha.
Is-Sports Betting API huwa l-ewwel proġett li ħadt kompletament minn kif jaħdem fuq il-magna tiegħi sa li verament ikun jista' jintlaħaq fuq l-internet. Docker għall-packaging, Azure Container Apps għall-hosting, Azure SQL Database warajh.
Id-Dockerfile huwa żewġ stadji, mhux wieħed
Il-verżjoni naive ta' Dockerfile ta' .NET tuża l-image tal-SDK u tieqaf hemm. Dan jaħdem, iżda jibgħat image bl-SDK sħiħ ta' .NET ġo fih, li huwa ħafna akbar minn dak meħtieġ biex sempliċiment tħaddem il-ħaġa.
Għalhekk il-build isseħħ fi stadju wieħed u r-riżultat jiġi kkupjat fi wieħed iżgħar:
FROM mcr.microsoft.com/dotnet/sdk:9.0 AS build
WORKDIR /src
# ... restore and publish ...
RUN dotnet publish -c Release -o /app/publish
FROM mcr.microsoft.com/dotnet/aspnet:9.0 AS runtime
WORKDIR /app
COPY --from=build /app/publish .
EXPOSE 8080
ENV ASPNETCORE_URLS=http://+:8080
ENTRYPOINT ["dotnet", "SportsBetting.API.dll"]
L-image finali hija bbażata fuq ir-runtime ta' ASP.NET u fiha biss l-output ippubblikat. L-istadju tal-SDK jagħmel xogħolu u jintrema.
Kkupjar tal-fajls tal-proġett qabel is-sors
Dan huwa d-dettall li mhux ovvju u li żbaljajt fih l-ewwel darba. Kull .csproj jiġi kkupjat l-ewwel, imbagħad dotnet restore jaħdem, u biss imbagħad il-bqija tas-sors jiġi kkupjat:
COPY SportsBetting.sln ./
COPY src/Backend/SportsBetting.API/SportsBetting.API.csproj src/Backend/SportsBetting.API/
COPY src/Backend/SportsBetting.Application/SportsBetting.Application.csproj src/Backend/SportsBetting.Application/
# ... the rest of the projects ...
RUN dotnet restore
COPY . .
Docker jagħmel cache ta' kull saff u jerġa' jużah jekk xejn li dak is-saff jiddependi fuqu ma jkunx inbidel. Peress li r-restore jiddependi biss fuq il-fajls tal-proġett, li tibdel fajl C# ma jinvalidahx, u l-packages ma jerġgħux jitniżżlu. Li tikkupja kollox mill-bidu u mbagħad tirrestora tfisser li kull bidla waħda fis-sors terġa' tniżżel kull package.
Huwa riordinar żgħir li jibdel il-biċċa l-kbira tar-rebuilds minn bil-mod għal kważi immedjati.
Compose, biex id-database tibda mal-app
Lokalment l-API teħtieġ SQL Server, u li tibdiehom separatament fl-ordni t-tajba tinsel malajr. Compose jieħu ħsieb it-tnejn, u l-parti utli hija li tagħmel l-API tistenna sakemm id-database tkun verament lesta minflok sempliċiment mibdija:
services:
sqlserver:
image: mcr.microsoft.com/mssql/server:2022-latest
healthcheck:
test: /opt/mssql-tools18/bin/sqlcmd -S localhost -U sa -P "..." -Q "SELECT 1" -C
interval: 10s
retries: 5
start_period: 30s
api:
build:
context: .
dockerfile: Dockerfile
depends_on:
sqlserver:
condition: service_healthy
depends_on waħdu jistenna biss sakemm il-container jibda, u container ta' SQL Server jaċċetta konnessjonijiet ħafna wara dak. Li tgħaqqdu ma' health check li verament tħaddem query hija dak li jagħmel id-differenza bejn l-API tibda nadif u tikkraxxja fuq konnessjoni li għamlet kmieni wisq.
Azure Container Apps
Għad-deployment mort għal Azure Container Apps minflok VM jew App Service. Iħaddem image ta' container direttament, li huwa eżatt dak li kelli diġà, u jiskala għal żero meta xejn ma jkun qed ilaqqtu.
Li tiskala għal żero għandu konsegwenza viżibbli: l-ewwel talba wara perjodu ta' inattività tieħu ftit sekondi filwaqt li container jibda. Għal proġett ta' studju dan huwa tpartit tajjeb, peress li ma jiswa xejn waqt li jkun kwiet. Għal xi ħaġa b'utenti reali kont inżomm minimu ta' replica waħda sħuna minflok.
Id-database hija Azure SQL Database, l-għażla managed, għalhekk mhux qed inżomm istanza ta' SQL Server jien stess. Il-konfigurazzjoni u l-connection string jiġu minn environment variables fil-Container App, l-istess mekkaniżmu li Compose juża lokalment, li jfisser li l-image innifisha hija identika fiż-żewġ postijiet.
X'verament ħa jaqbad f'moħħi
Il-ħaġa li fhimt biss wara li għamiltha: il-container huwa l-unità deployable, u l-ambjent huwa sempliċiment konfigurazzjoni madwaru. L-istess image li nibni u nħaddem lokalment hija dik li taħdem f'Azure, b'environment variables differenti ippuntati lejn infrastruttura differenti. L-ebda build separat għall-produzzjoni, l-ebda kodiċi li jġib ruħu differenti skont fejn qed jaħdem.
Dik hija l-parti li għamlet l-idea kollha ta' Docker taqbad f'moħħi. Mhux "jippakkja l-app," iżda li l-ħaġa li ttestjajt lokalment hija litteralment il-ħaġa li taħdem fil-cloud.
X'nagħmel li jmiss
Workflow ta' GitHub Actions li jibni l-image u jiddeplojaha fuq push għal main, biex id-deployment ma jkunx xi ħaġa li nagħmel bl-idejn. Dak huwa l-lakuna ovvja bejn dan u kif kien jaħdem fuq tim reali.