.Net Core 用自動生成Dockerfile的坑


簡介

  之前采用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指令是從構建上下文目錄中去復制文件的。

  這句話的意思也就是說,因為我是在ExamManager.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學習筆記圖



免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM