版本的dotnet构建在docker中不起作用

时间:2019-02-25 21:19:22

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

我正在尝试使用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)上运行相同的命令,这也很好-我的build命令具有程序集版本。但我不知道为什么它不能在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文件中定义了版本,但没有覆盖。

2 个答案:

答案 0 :(得分: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"

答案 1 :(得分:1)

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

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

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

但是,这样做时,请勿使用--single-branch参数。上面的命令除了从远程存储库中克隆特定分支之外,还获取其他分支的所有头,GitVersion要求其他分支才能执行其版本计算。 (请参阅TeamCity Setup documentation中GitVersion的 Agent Setup 标题,其中对此进行了解释。)