Ошибка передачи аргументов сборки в dockerfile при построении изображения - '$ MyVersion' не является допустимой строкой версии - PullRequest
0 голосов
/ 06 ноября 2018

У меня есть проект asp.net .net core 2.1, и мы используем Docker-контейнер, размещенный в Linux. Это работало хорошо. Теперь у нас есть требование установить версию ассемблера проекта при создании образа Docker с использованием файла Docker.

Итак, предположительно, я могу передать его как build-arg при сборке образа docker с помощью dockerfile. Но я не могу заставить его работать.

ARG MyVersion="0.0.1.0"

FROM microsoft/dotnet:2.1-aspnetcore-runtime-nanoserver-1709 AS base
WORKDIR /app
EXPOSE 8081 

FROM microsoft/dotnet:2.1-sdk-nanoserver-1709 AS build
WORKDIR /src
COPY source/MyApp/MyApp.csproj source/MyApp/  
RUN dotnet restore source/MyApp/MyApp.csproj  
COPY . .
WORKDIR /src/source/MyApp
RUN dotnet build MyApp.csproj /p:Version=$MyVersion -c Release -o /app

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

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

и соберите его с помощью команды

docker build --build-arg MyVersion=1.22.1.0 -t MyGoodApp -f MyApp.Dockerfile .

В Linux я получаю это сообщение

Задаче «GetAssemblyVersion» не было задано значение для требуемого параметр "NuGetVersion"

В окнах

C: \ Program Files \ dotnet \ sdk \ 2.1.402 \ NuGet.targets (114,5): ошибка: '$ MyVersion' не является допустимой строкой версии.

Вышеприведенная ошибка указывает, что $ MyVersion не передается / устанавливается неправильно в строке RUN dotnet publish MyApp.csproj / p: Version = $ MyVersion -c Release -o / app

Но я не вижу, что не так.

Пожалуйста, сообщите,

Ответы [ 2 ]

0 голосов
/ 07 ноября 2018

Наконец я нашел проблемы,

Для файла Docker на основе Windows мы должны ссылаться на переменную с помощью% MyVar%,

RUN dotnet build MyApp.csproj / p: Версия =% MyVersion% -c Выпуск -o / app

и относительно ARG, они должны быть расположены прямо под оператором FROM.

ОТ microsoft / dotnet: 2.1-aspnetcore-runtime-nanoserver-1709 AS base ARG MyVersion = "0.0.1.0"

Вот рабочий файл докера

FROM microsoft/dotnet:2.1-aspnetcore-runtime-nanoserver-1709 AS base
ARG MyVersion="0.0.1.0"
WORKDIR /app
EXPOSE 8081 

FROM microsoft/dotnet:2.1-sdk-nanoserver-1709 AS build
ARG MyVersion
WORKDIR /src
COPY source/MyApp/MyApp.csproj source/MyApp/  
RUN dotnet restore source/MyApp/MyApp.csproj  
COPY . .
WORKDIR /src/source/MyApp
RUN dotnet build MyApp.csproj /p:Version=%MyVersion% -c Release -o /app

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

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

Для Linux это то же самое, за исключением того, что ARG является эталонным, используя $ MyVar

RUN dotnet build MyApp.csproj / p: версия = $ MyVersion -c выпуск -o / app

0 голосов
/ 07 ноября 2018

Попробуйте добавить ARG MyVersion до RUN dotnet build MyApp.csproj /p:Version=$MyVersion -c Release -o /app.

Вот полный докер-файл

    ARG MyVersion="0.0.1.0"

FROM microsoft/dotnet:2.1-aspnetcore-runtime AS base
WORKDIR /app
EXPOSE 49880
EXPOSE 44381

FROM microsoft/dotnet:2.1-sdk AS build
WORKDIR /src
COPY ["DockerVersion/DockerVersion.csproj", "DockerVersion/"]
RUN dotnet restore "DockerVersion/DockerVersion.csproj"
COPY . .
WORKDIR "/src/DockerVersion"
RUN dotnet build "DockerVersion.csproj" -c Release -o /app

FROM build AS publish
ARG MyVersion
RUN echo $MyVersion
RUN dotnet publish "DockerVersion.csproj" /p:Version=$MyVersion -c Release -o /app

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

ARG, объявленный до FROM, находится вне стадии сборки, поэтому его нельзя использовать в любой инструкции после FROM. Чтобы использовать значение по умолчанию для ARG, объявленного перед первым FROM, используйте инструкцию ARG без значения внутри этапа сборки:

Вы можете проверить Понять, как ARG и FROM взаимодействуют .

...