部屬.NET Core 3.1 到 GCP Cloud Run

  • 81
  • 0
  • 2022-12-22

因應 Heroku 免費方案取消,紀錄部屬到 Cloud Run 需要調整的設定

 

  • Dockerfile
    VS自動產生的即可,但須移動到上一層資料夾(同.sln),並修改line 8,改為 :COPY . ./
FROM mcr.microsoft.com/dotnet/aspnet:3.1 AS base
WORKDIR /app
EXPOSE 80
EXPOSE 443

FROM mcr.microsoft.com/dotnet/sdk:3.1 AS build
WORKDIR /src
COPY . ./
RUN dotnet restore "project/project.csproj"
COPY . .
WORKDIR "/src/project"
RUN dotnet build "project.csproj" -c Release -o /app/build

FROM build AS publish
RUN dotnet publish "project.csproj" -c Release -o /app/publish

FROM base AS final
WORKDIR /app
COPY --from=publish /app/publish .
ENTRYPOINT ["dotnet", "project.dll"]
  • Program.cs
    Release 時要抓環境變數設定 Port
    public class Program
    {
        public static void Main(string[] args)
        {
            CreateHostBuilder(args).Build().Run();
        }

        public static IHostBuilder CreateHostBuilder(string[] args)
        {
#if DEBUG
            return Host.CreateDefaultBuilder(args)
                .ConfigureWebHostDefaults(webBuilder =>
                {
                    webBuilder.UseStartup<Startup>();
                });
#endif

#if !DEBUG
            return Host.CreateDefaultBuilder(args)
                .ConfigureWebHostDefaults(webBuilder =>
                {
                    webBuilder.UseStartup<Startup>()
                        .ConfigureKestrel(options =>
                        {
                            var port = Convert.ToInt32(Environment.GetEnvironmentVariable("PORT") ?? "8080");
                            options.Listen(IPAddress.Any, port);
                        });
                });
#endif
        }
    }
  • 執行指令
    編譯並上傳到 GCP 的 Docker image 管理平台 Container Registry
docker build -t project -f Dockerfile .
gcloud builds submit --tag asia.gcr.io/project/project


參考資料
https://blog.cloud-ace.tw/application-modernization/serverless/cloud-run-api-server/
https://www.minwt.com/website/server/22839.html
https://blog.darkthread.net/blog/aspnetcore-docker-with-cli/