【问题标题】:dotnet build with version is not working in docker带有版本的 dotnet 构建在 docker 中不起作用
【发布时间】:2023-03-04 01:34:02
【问题描述】:

我正在尝试使用 Docker 构建我的 .net 核心应用程序。 我想在构建期间覆盖我的应用版本。在运行时稍后的某个地方显示它。

我的 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 文件中定义了没有覆盖的版本。

【问题讨论】:

  • 你能比“不工作”更具体吗?您遇到了什么精确行为?
  • 每次我的构建成功但我在 .csproj 文件中定义了没有覆盖的版本。
  • 看起来预期的参数是 -p 用于传递给 msbuild 的属性,而不是 /property。这些处理可能在 linux 和 windows 命令行之间有所不同?
  • 我相信这里都允许。我刚刚在我的 dockerfile 中检查了 -p 并且得到了相同的结果。我在 MS 文档中使用了 \p 。如果存在不允许的标志,dotnet build 将引发错误。我还在 Linux (WSL) 上检查过,两者都正常。
  • 您是否尝试过使用VersionSuffix 代替:github.com/dotnet/cli/issues/3778

标签: .net docker .net-core dockerfile gitversion


【解决方案1】:

是的,这应该是一项微不足道的任务,但在我最终能够完成之前,我也遇到了一些问题。花了几个小时解决问题,希望您能节省时间。我建议阅读 this 发布它有帮助。

我的最终解决方案是使用 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阶段。查看类似问题here

最后你可以调用你的 Docker 构建:

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

【讨论】:

  • 为什么不直接将 ARG 命令放在使用的行变量之前而不进行任何“重新声明”?
【解决方案2】:

为了让 GitVersion 正常工作,它需要来自 git 存储库的更多信息,这些信息在 Docker 映像中不可用。

您可以尝试在您的 docker 映像中,从正在构建的 git 存储库中克隆单个分支:

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

但是,在执行此操作时,请勿使用--single-branch 参数。上面的命令除了从远程存储库克隆特定分支外,还获取其他分支的所有头部,GitVersion 需要这些头部才能执行其版本计算。 (请参阅 TeamCity Setup documentation 中的 代理设置 标题以获取 GitVersion 的说明)。

【讨论】:

    【解决方案3】:

    我也遇到了同样的问题,调试了好久终于找到原因了。

    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 文件中获取的值)。

    这就是Major answer 起作用的原因。属性设置为 dotnet publish

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

    【讨论】:

      猜你喜欢
      • 2019-06-12
      • 1970-01-01
      • 1970-01-01
      • 2013-07-10
      • 1970-01-01
      • 1970-01-01
      • 2018-03-08
      • 2020-02-18
      • 2017-08-01
      相关资源
      最近更新 更多