.Net Core 用自動生成Dockerfile的坑
阿新 • • 發佈:2020-01-09
簡介
之前採用shell指令碼+dockerfile的方式構建專案,後來發現有Docker在17.05版本之後有多階段構建方式,該文主要記錄了netcore採用dockerfile構建遇到的坑。
原先的方式
這種方式理解起來比較簡單就是把構建netcore的前期工作寫個shell指令碼來完成,dockerfile拿到已經編譯好的檔案執行。這種方式存在的一個問題就是部署過程比較複雜
單獨的shell指令碼
#!/bin/bash # 轉到exam程式碼 cd /root/code/examManager/exammanager/ExamManager.Web # 獲取最新程式碼 sudo git pull # 編譯 sudo dotnet build # 複製檔案到釋出資料夾 sudo cp -r /root/code/examManager/exammanager/ExamManager.Web/ExamManager.Web/bin/Debug/netcoreapp3.1/. /root/release/exam-dev # 映象刪除 sudo docker rm -f exam sudo docker rmi exam # 進入程式碼 cd /root/release/exam-dev # 啟動docker docker-compose -p exam up -d # 退出
當時的dockerfile
FROM microsoft/dotnet:latest
WORKDIR /app
copy . ./
EXPOSE 80 443
# 構建映象
ENTRYPOINT ["dotnet", "ExamManager.Web.dll"]
多階段構建
為解決以上部署的問題,Docker v17.05開始支援多階段構建,使用多階段構建只需要編寫一個Dockerfile就可以解決上述問題.,下面是最終可執行的檔案
FROM mcr.microsoft.com/dotnet/core/aspnet:3.1-buster-slim AS base WORKDIR /app EXPOSE 80 443 ENV LANG C.UTF-8 LABEL maintainer="test.qq.com" FROM mcr.microsoft.com/dotnet/core/sdk:3.1-buster AS build WORKDIR /src copy . . RUN dotnet restore "ExamManager.Web/Exam.Web.csproj" WORKDIR "/src/ExamManager.Web" RUN dotnet build "Exam.Web.csproj" -c Release -o /app/build FROM build AS publish RUN dotnet publish "Exam.Web.csproj" -c Release -o /app/publish from base AS final WORKDIR /app COPY --from=publish /app . ENTRYPOINT ["dotnet", "Exam.Web.dll"]
上述程式碼中為netcore自動生成的Dockerfile檔案,只不過把原來的copy csproj檔案,改成了copy所有檔案(copy ..)
問題
詳細錯誤如下:
COPY failed: Forbidden path outside the build context: ../src/Exam.Application/Exam.Application.csproj ()
該問題由於當時我的專案結構放在不同的資料夾當中,導致copy的時候,獲取不到上下文。
Web頁面和相關Dockerfile檔案都在ExamManager.Web當中,其餘專案檔案全在src目錄下,一定要注意:
這個原因是Copy指令是從構建上下文目錄中去複製檔案的。
這個原因是Copy指令是從構建上下文目錄中去複製檔案的。
這個原因是Copy指令是從構建上下文目錄中去複製檔案的。
這句話的意思也就是說,因為我是在ExamManagerWeb.Web目錄下執行的構建命令,由於docker 客戶端會把上下文中的所有檔案傳送給 docker daemon。所以構建的時候是無法獲取src這個路徑。
COPY ["../src/Exam.Application/Exam.Application.csproj","src/Exam.Application/"]
解決方案
構建動作在上層也就是sln目錄當中,去執行這樣的話,上下文中就包括了整個專案。
# -f指定構建的檔案
docker build -f ExamManager.Web/Dockerfile -t exam .
問題2
在用netcore原生的命令的時候,在進行dotnet build的時候也總是報錯。dockerfile檔案:
COPY ["ExamManager.Web/Exam.Web.csproj","exam-dev/"]
COPY ["src/Exam.Application/Exam.Application.csproj","src/Exam.Application/"]
COPY ["src/Exam.Domain/Exam.Domain.csproj","src/Exam.Domain/"]
一直在構建哪一步報錯。
CSC : error CS5001: Program does not contain a static 'Main' method suitable for an entry point [/src/exam-dev/Exam.Web.csproj]
原因暫時未知。
在這過程中還碰到一些奇怪的錯誤,後來發現是自己在改dockerfile的時候,慌了神,仔細檢視是由於沒有加空格的原因.
MSBUILD : error MSB1008: Only one project can be specified.
另附一張總結的docker學習筆記圖