0

我找到了Scott Hanselman 的关于使用 dotnet 将 git commit hashes 添加到构建的教程。我尝试在我自己的项目中采用他的方法,该项目正在构建到 Azure Devops Pipelines 中的 Docker 映像中。不幸的是,git hash 永远不会进入程序集。

在我的 docker 文件中,我有:

FROM mcr.microsoft.com/dotnet/core/aspnet:3.1-buster-slim AS base

ARG SOURCE_REVISION_ID

WORKDIR /app
RUN sed -i 's/DEFAULT@SECLEVEL=2/DEFAULT@SECLEVEL=1/g' /etc/ssl/openssl.cnf
RUN sed -i 's/DEFAULT@SECLEVEL=2/DEFAULT@SECLEVEL=1/g' /usr/lib/ssl/openssl.cnf

EXPOSE 80
EXPOSE 443

FROM mcr.microsoft.com/dotnet/core/sdk:3.1-buster AS build
WORKDIR /src

RUN dotnet restore "Project/Project.csproj"
COPY . .
WORKDIR "/src/Project"
RUN dotnet build "Project.csproj" -c Release -o /app/build /p:SourceRevisionId=${SOURCE_REVISION_ID}

FROM build AS publish
RUN dotnet publish "Project.csproj" -c Release -o /app/publish

FROM base AS final
WORKDIR /app
COPY --from=publish /app/publish .
ENTRYPOINT ["dotnet", "Project.dll"]

调用dotnet build "Project.csproj"使用/p:SourceRevisionId=${SOURCE_REVISION_ID}Scott 帖子中描述的参数。

我在构建和推送 docker 代理的管道中有离散步骤,正如我在其他地方发现--build-arg的那样,在组合的 BuildAndPush 作业中没有传递给 Docker。我可以看到管道正在将正确的内容传递SOURCE_REVISION_ID给构建作业,例如--build-arg SOURCE_REVISION_ID=7397bf9c2650e6cd9452f5c40c6e1738fbb32532.

我怀疑有几件事之一是原因,但我不确定是哪一个:

  1. 我使用不正确的语法来检索SOURCE_REVISION_ID调用中的参数值dotnet build
  2. 我误解了 Dockerfile 和 Dockerfile 之间的区别ARGENV需要将我的 build 参数的值复制到一个变量中以备后用。如果是这种情况,我不明白为什么。
  3. 实际上它工作正常,但是我的代码没有AssemblyInformationalVersion正确地从程序集中提取(尽管我从 Scott 的帖子中复制和粘贴了代码!)

请帮助阻止我秃头!

4

1 回答 1

0

您正在使用多阶段 Dockerfile 并ARG在第一阶段指定,但实际上在第二阶段引用它。AnARG的范围仅限于它所包含的阶段。您应该将 移到ARG第二阶段,在FROM mcr.microsoft.com/dotnet/core/sdk:3.1-buster AS build.

于 2020-07-08T13:00:02.133 回答