.NET Core linux/arm64 dockerfile (родной AOT?)

Вопрос или проблема

Существует ли какой-либо шаблон dockerfile для кросс-компиляции контейнеров linux/arm64 на машине x86 с использованием нативной AOT, если это возможно? Я пробовал этот, но размер docker-образа составил около 1 ГБ всего только для Console.WriteLine("Hello World!"); и он не работает.

У меня установлены clang zlib1g-dev на Ubuntu.

FROM mcr.microsoft.com/dotnet/runtime:8.0 AS base
USER app
WORKDIR /app

FROM --platform=$BUILDPLATFORM  mcr.microsoft.com/dotnet/sdk:8.0 AS build
ARG BUILD_CONFIGURATION=Release
ARG TARGETARCH
WORKDIR /src
COPY ["Arm64.csproj", "."]
RUN dotnet restore "./././Arm64.csproj" --arch $TARGETARCH
COPY . .
WORKDIR "/src/."
RUN dotnet build "./Arm64.csproj" -c $BUILD_CONFIGURATION -o /app/build --arch $TARGETARCH

FROM  --platform=$BUILDPLATFORM build AS publish
ARG BUILD_CONFIGURATION=Release
ARG TARGETARCH
RUN dotnet publish "./Arm64.csproj" -c $BUILD_CONFIGURATION -o /app/publish /p:UseAppHost=false --arch $TARGETARCH

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

Добавление некоторых элементов clang приводит к сбоям в docker build с ошибками линковки. Мой VS2022 на Windows, похоже, сломан, так как сборка любого проекта с включенной AOT застревает на dotnet restore, поэтому я пытаюсь собрать из Ubuntu.

Я не очень знаком с Docker, просто хочу попробовать что-то на RouterOS с контейнером .NET Core.

Ответ или решение

Создание Dockerfile для кросс-сборки linux/arm64 с использованием .NET Core

Вам необходимо создать Dockerfile для кросс-сборки контейнеров linux/arm64 на x86-архитектуре с использованием .NET Core и режима Native AOT (Ahead-Of-Time). Native AOT позволяет создать приложение, которое компилируется в исполняемый файл, минимизируя размер конечного образа.

Вот пример оптимизированного Dockerfile, который должен помочь вам создать малый размер образа и устранить проблемы, которые возникли в вашем предыдущем подходе:

# Используем официальный образ .NET для runtime
FROM mcr.microsoft.com/dotnet/runtime:8.0 AS base
WORKDIR /app
COPY --chown=app:app ./Arm64.dll ./

# Используем образ SDK для сборки
FROM --platform=$BUILDPLATFORM mcr.microsoft.com/dotnet/sdk:8.0 AS build
ARG BUILD_CONFIGURATION=Release
ARG TARGETARCH
WORKDIR /src
COPY ["Arm64.csproj", "./"]
RUN dotnet restore

COPY . .
RUN dotnet build "Arm64.csproj" -c $BUILD_CONFIGURATION -o /app/build

# Публикуем приложение с использованием Native AOT
FROM build AS publish
RUN dotnet publish "Arm64.csproj" -c $BUILD_CONFIGURATION -o /app/publish /p:UseAppHost=true /p:PublishAot=true

# Финальный образ
FROM base AS final
COPY --from=publish /app/publish ./
ENTRYPOINT ["./Arm64"]

Разбор Dockerfile

  1. Базовый образ: Мы начинаем с базового образа mcr.microsoft.com/dotnet/runtime:8.0, который предоставляет среду выполнения .NET для приложения.

  2. Этап сборки: Используем образ SDK, чтобы подготовить и собрать проект. Обратите внимание, что мы передаем целевую архитектуру через переменную ARG. Это поможет выполнить сборку для нужной архитектуры.

  3. Native AOT: В этом Dockerfile мы добавили атрибуты /p:UseAppHost=true и /p:PublishAot=true в команду dotnet publish, что позволит создать AOT-версию вашего приложения. Это уменьшает размер образа и делает приложение более производительным.

  4. Финальный образ: На последнем этапе мы копируем подготовленное приложение в финальный образ и устанавливаем его как точку входа.

Проблемы с размером образа

Обратите внимание, что размер образа может увеличиваться в связи с необходимыми зависимостями и включением средств разработки. Для уменьшения размера образа можно использовать многоэтапную сборку, что уже предусмотрено в нашем Dockerfile.

Устранение ошибок при сборке

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

Заключение

Эта структура Dockerfile должна помочь вам успешно собрать и запустить приложение .NET Core на архитектуре arm64 с использованием режима Native AOT. Используя представленный шаблон и учитывая необходимые зависимости и настройки, вы сможете значительно упростить процесс сборки контейнера. Удачи в ваших экспериментах с .NET Core и Docker!

Оцените материал
Добавить комментарий

Капча загружается...