.NET 7 Многоплатформенная сборка докера - как условно изменить целевую платформу в Dockerfile?

У меня есть Dockerfile для приложения .NET7, которое я создаю с помощью docker buildx как для linux/amd64, так и для linux/arm64. Все это работает нормально.

Как бы я хотел оптимизировать свою сборку на основе этого образца, чтобы включить правильную целевую платформу в команду dotnet restore/publish. Но я пока не мог понять, как это сделать условно внутри Dockerfile.

У меня есть это до сих пор, но, конечно, это не работает, поскольку переменные из первой команды RUN не сохраняются для следующих команд.

Любые идеи приветствуются!

FROM mcr.microsoft.com/dotnet/sdk:7.0 AS build-env

ARG TARGETPLATFORM
ARG BUILDPLATFORM

RUN echo "I am running on $BUILDPLATFORM, building for $TARGETPLATFORM" > /log

# The following works but does not persist on to the next RUN

RUN if [ "$TARGETPLATFORM" = "linux/arm64 " ] ; then DOTNET_TARGET=linux-musl-arm64 ; else DOTNET_TARGET=linux-x64 ; fi

WORKDIR /app
COPY . ./
RUN dotnet restore MyApp -r $DOTNET_TARGET /p:PublishReadyToRun=true
RUN dotnet publish MyApp  -c Release -o Ahs.AuthManager/out -r $DOTNET_TARGET --self-contained true --no-restore /p:PublishTrimmed=true /p:PublishReadyToRun=true /p:PublishSingleFile=true

## more to follow here...

как? аргументы платформы устанавливаются buildx - и значения отличаются от того, что нужно dotnet в качестве входных данных

silent 18.11.2022 16:03
Как создать PHP Image с нуля
Как создать PHP Image с нуля
Сегодня мы создадим PHP Image from Scratch для того, чтобы легко развернуть базовые PHP-приложения. Пожалуйста, имейте в виду, что это разработка для...
0
1
108
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Установленная вами переменная DOTNET_TARGET не сохраняет свое состояние после выполнения этой инструкции, потому что каждая инструкция RUN использует новую оболочку. Вы можете либо сохранить значение в файле для последующего чтения, либо встроить настройку переменной в команды, которые ее используют.

FROM mcr.microsoft.com/dotnet/sdk:7.0 AS build-env

ARG TARGETPLATFORM
ARG BUILDPLATFORM

RUN echo "I am running on $BUILDPLATFORM, building for $TARGETPLATFORM" > /log

# The following works but does not persist on to the next RUN

RUN if [ "$TARGETPLATFORM" = "linux/arm64 " ] ; then DOTNET_TARGET=linux-musl-arm64 ; else DOTNET_TARGET=linux-x64 ; fi \
    && echo $DOTNET_TARGET > /tmp/rid

WORKDIR /app
COPY . ./
RUN dotnet restore MyApp -r $(cat /tmp/rid) /p:PublishReadyToRun=true
RUN dotnet publish MyApp  -c Release -o Ahs.AuthManager/out -r $(cat /tmp/rid) --self-contained true --no-restore /p:PublishTrimmed=true /p:PublishReadyToRun=true /p:PublishSingleFile=true

## more to follow here...

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