docker釋出專案的一些坑

远方的诗意發表於2024-10-09

使用docker釋出應用分為兩種方式

1.使用原始碼直接釋出:在建立專案的時候,vs會自動生成一個叫Dockerfile 的檔案,我們一般會根據這個檔案來製作映象,然後將映象執行在docker容器中。Dockerfile 如下所示

#See https://aka.ms/containerfastmode to understand how Visual Studio uses this Dockerfile to build your images for faster debugging.

FROM mcr.microsoft.com/dotnet/core/aspnet:3.1-buster-slim AS base
WORKDIR /app
EXPOSE 80

FROM mcr.microsoft.com/dotnet/core/sdk:3.1-buster AS build
WORKDIR /src
COPY ["xxx.Admin.Web/United.Admin.Web.csproj", "xxx.Admin.Web/"]
COPY ["xxx.WebCommon/United.WebCommon.csproj", "xxx.WebCommon/"]
COPY ["Company.Framework/Company.Framework.csproj", "Company.Framework/"]
COPY ["Company.Domain/Company.Domain.csproj", "Company.Domain/"]
COPY ["Company.Application.Shared/Company.Application.Shared.csproj", "Company.Application.Shared/"]
COPY ["Company.Application.Admin/Company.Application.Admin.csproj", "Company.Application.Admin/"]
RUN dotnet restore "United.Admin.Web/United.Admin.Web.csproj"
COPY . .
WORKDIR "/src/xxx.Admin.Web"
RUN dotnet build "xxx.Admin.Web.csproj" -c Release -o /app/build

FROM build AS publish
RUN dotnet publish "xxx.Admin.Web.csproj" -c Release -o /app/publish

FROM base AS final
WORKDIR /app
COPY --from=publish /app/publish .
ENTRYPOINT ["dotnet", "xxx.HealthWeb.dll"]

從以上程式碼上可知,Dockerfile 指定了.netcore 的SDK和Runtime的版本映象。開發80埠,指定工作目錄 SRC  複製相關的類庫到工作目錄,然後對專案進行了還原,構建,釋出,等三個動作,這三個動作做完以後 執行當前dll檔案。這種方法雖然很爽,但是有坑有坑有坑。當我們進入了專案目錄的時候,執行docker build 的時候,發現出問題了。。具體如何提示的我懶就不想截圖的,大概報的錯是dockerfile中的路徑問題。。系統給我們生成的dockerfile 我們不要全信。裡面的路徑大多數是有問題的 大家使用的時候,一定要仔細核對。

2.在VS中釋出後的專案做Docker映象製作

  VS釋出專案的步驟應該都很熟悉了,在VS釋出後會生成一個名為publish資料夾,直接進入publish資料夾裡執行命令 docker build 操作。但是Dockerfile 檔案中會有相應的改變,之前的還原,構建,釋出的三個動作已經在VS中完成。只需要執行即可 修改後的Dockerfile如下

FROM mcr.microsoft.com/dotnet/aspnet:3.1 AS base
FROM mcr.microsoft.com/dotnet/sdk:3.1 AS build
ENV ASPNETCORE_URLS http://+:40461
ENV TZ=Asia/Shanghai
RUN ln -snf /usr/share/zoneinfo/$TZ /etc/localtime && echo $TZ > /etc/timezone
COPY . /publish
WORKDIR /publish
EXPOSE 40461
ENTRYPOINT ["dotnet", "xxx.HealthWeb.dll"]
注意:是資料夾是publish 工作目錄就是publish

相關文章