Почему сборка Docker Build Azure Devops Pipelines не вставляет мою версию фиксации в мою базовую сборку dotnet?

Я нашел руководство Скотта Хансельмана по добавлению хэшей коммитов git в сборки с использованием dotnet. Я попытался применить его подход в своем собственном проекте, который встраивается в образы Docker в Azure Devops Pipelines. К сожалению, хеш git никогда не попадает в сборку.

В моем файле докеров есть:

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} аргумент, как описано в сообщении Скотта.

У меня есть отдельные шаги в моем конвейере для агентов докеров Build и Push, как я нашел в другом месте, которые --build-argне передаются в Docker в комбинированном задании BuildAndPush. Я вижу, что конвейер проходит правильныйSOURCE_REVISION_ID к работе по сборке, например --build-arg SOURCE_REVISION_ID=7397bf9c2650e6cd9452f5c40c6e1738fbb32532.

Я подозреваю, что одна из нескольких причин является причиной, но я не уверен, что именно:

  1. Я использую неправильный синтаксис для получения значения SOURCE_REVISION_ID аргумент в моем призыве к dotnet build.
  2. Я неправильно понял разницу между ARG а также ENVв Dockerfile и мне нужно скопировать значение моего аргумента сборки в переменную для использования позже. Если это так, я не понимаю, почему.
  3. На самом деле он работает нормально, но мой код не извлекает AssemblyInformationalVersion из сборки правильно (несмотря на мою копию и вставку кода из сообщения Скотта!)

Пожалуйста, помогите мне не облысеть!

1 ответ

Решение

Вы используете многоступенчатый Dockerfile и указали ARGна первом этапе, но на самом деле ссылаться на него на втором этапе. AnARG ограничен той стадией, на которой он содержится. Вы должны переместить ARG ко второму этапу, после FROM mcr.microsoft.com/dotnet/core/sdk:3.1-buster AS build.

Другие вопросы по тегам