Почему сборка 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
.
Я подозреваю, что одна из нескольких причин является причиной, но я не уверен, что именно:
- Я использую неправильный синтаксис для получения значения
SOURCE_REVISION_ID
аргумент в моем призыве кdotnet build
. - Я неправильно понял разницу между
ARG
а такжеENV
в Dockerfile и мне нужно скопировать значение моего аргумента сборки в переменную для использования позже. Если это так, я не понимаю, почему. - На самом деле он работает нормально, но мой код не извлекает
AssemblyInformationalVersion
из сборки правильно (несмотря на мою копию и вставку кода из сообщения Скотта!)
Пожалуйста, помогите мне не облысеть!
1 ответ
Вы используете многоступенчатый Dockerfile и указали ARG
на первом этапе, но на самом деле ссылаться на него на втором этапе. AnARG
ограничен той стадией, на которой он содержится. Вы должны переместить ARG
ко второму этапу, после FROM mcr.microsoft.com/dotnet/core/sdk:3.1-buster AS build
.