簡體   English   中英

帶有版本的 dotnet 構建在 docker 中不起作用

[英]dotnet build with version is not working in docker

我正在嘗試使用 Docker 構建我的 .net 核心應用程序。 我想在 build 期間覆蓋我的應用程序版本 在運行時稍后的某個地方顯示它。

我的 Docker 文件如下所示:

FROM microsoft/dotnet:2.2-sdk AS build-env
WORKDIR /src

RUN apt-get update && \
    apt-get install -y libgit2-dev && \
    ln -s /usr/lib/x86_64-linux-gnu/libgit2.so /lib/x86_64-linux-gnu/libgit2-15e1193.so

COPY ..

WORKDIR /src/API

RUN dotnet restore

RUN dotnet tool install -g GitVersion.Tool --version=5.0.0-beta1-72

RUN export PATH="$PATH:/root/.dotnet/tools" && \
    version="$(dotnet gitversion /output json /showvariable NuGetVersion)" && \
    dotnet build --no-restore /property:Version=$version  && \
    dotnet publish --output "/app" --no-build

FROM microsoft/dotnet:2.2-aspnetcore-runtime
WORKDIR /app
COPY --from=build-env /app .
ENTRYPOINT ["dotnet", "API.dll"]

當我在我的 Windows 機器上嘗試與 RUN 指令相同的命令時 - 一切正常。 我還嘗試在 WSL(Ubuntu 18)上運行相同的命令,這也很好 -我的構建命令有匯編版本。 但我不明白為什么它在 Docker 中不起作用。

我也嘗試刪除我所有的 GitVersion 魔法並使用這個:

FROM microsoft/dotnet:2.2-sdk AS build-env
WORKDIR /src

RUN apt-get update && \
    apt-get install -y libgit2-dev && \
    ln -s /usr/lib/x86_64-linux-gnu/libgit2.so /lib/x86_64-linux-gnu/libgit2-15e1193.so

COPY ..

WORKDIR /src/API

RUN dotnet restore

RUN dotnet build --no-restore /property:Version=1.1.1.0-beta1
RUN dotnet publish --output "/app" --no-build

FROM microsoft/dotnet:2.2-aspnetcore-runtime
WORKDIR /app
COPY --from=build-env /app .
ENTRYPOINT ["dotnet", "API.dll"]

無論如何,我的結果是一樣的。

我使用此代碼來檢查:

public static void Main(string[] args)
{
    Console.WriteLine(typeof(Program).Assembly.GetName());
}

每次我的構建都成功但我在 .csproj 文件中定義了版本而沒有覆蓋。

是的,這應該是一項微不足道的任務,但在我最終完成之前我也遇到了一些問題。 花了幾個小時來解決問題,希望你能節省時間。 我建議閱讀這篇文章,它有幫助。

我的最終解決方案是使用Docker ARG ,您必須在第一個 FROM 之前聲明它:

#Declare it at the beginning of the Dockerfile
ARG BUILD_VERSION=1.0.0
...
#Publish your project with "-p:Version=${BUILD_VERSION}" it works also with "dotnet build"
RUN dotnet publish "<xy.csproj>" -c Release -o /app/publish --no-restore -p:Version=${BUILD_VERSION}

需要注意的一件非常重要的事情是:如果您使用多階段構建(文件中有多個 FROM),則必須在該階段“重新聲明” ARG 在這里看到一個類似的問題。

最后,您可以使用以下命令調用您的 Docker 構建:

docker build --build-arg BUILD_VERSION="1.1.1.1"

為了讓 GitVersion 正常工作,它需要來自 git 存儲庫的更多信息,而這些信息在您的 Docker 映像中不可用。

您可以嘗試在 docker 映像中從正在構建的 git 存儲庫中克隆單個分支:

git clone -b <branch> <remote-repo>

但是,在執行此操作時,請勿使用--single-branch參數。 上面的命令除了從遠程存儲庫克隆特定分支外,還會獲取其他分支的所有頭部,這是 GitVersion 執行版本計算所需的。 (請參閱 GitVersion 的TeamCity 設置文檔中代理設置標題,其中解釋了這一點)。

我遇到了同樣的問題,經過長時間的調試,我設法找出了原因。

RUN dotnet build --no-restore /property:Version=1.1.1.0-beta1 -o &&
RUN dotnet publish --output "/app" --no-build

例如,由dotnet build創建的程序集具有正確的版本號 - 1.1.1.0-beta1 然而,命令dotnet publish通過從 .csproj 文件中獲取的值覆蓋所需的版本號。

這就是為什么主要答案有效的原因。 屬性設置為dotnet publish

RUN dotnet publish "<xy.csproj>" -c Release -o /app/publish --no-restore -p:Version=${BUILD_VERSION}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM