Вопрос или проблема
Существует ли какой-либо шаблон 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
-
Базовый образ: Мы начинаем с базового образа
mcr.microsoft.com/dotnet/runtime:8.0
, который предоставляет среду выполнения .NET для приложения. -
Этап сборки: Используем образ SDK, чтобы подготовить и собрать проект. Обратите внимание, что мы передаем целевую архитектуру через переменную ARG. Это поможет выполнить сборку для нужной архитектуры.
-
Native AOT: В этом Dockerfile мы добавили атрибуты
/p:UseAppHost=true
и/p:PublishAot=true
в командуdotnet publish
, что позволит создать AOT-версию вашего приложения. Это уменьшает размер образа и делает приложение более производительным. -
Финальный образ: На последнем этапе мы копируем подготовленное приложение в финальный образ и устанавливаем его как точку входа.
Проблемы с размером образа
Обратите внимание, что размер образа может увеличиваться в связи с необходимыми зависимостями и включением средств разработки. Для уменьшения размера образа можно использовать многоэтапную сборку, что уже предусмотрено в нашем Dockerfile.
Устранение ошибок при сборке
Если вы сталкиваетесь с ошибками компоновки при добавлении clang
, это может быть связано с тем, что настройки среды не подходят для вашей сборки AOT. Убедитесь, что все зависимости корректно установлены, и попробуйте удалять или изменять настройки, добавленные в предыдущие попытки.
Заключение
Эта структура Dockerfile должна помочь вам успешно собрать и запустить приложение .NET Core на архитектуре arm64 с использованием режима Native AOT. Используя представленный шаблон и учитывая необходимые зависимости и настройки, вы сможете значительно упростить процесс сборки контейнера. Удачи в ваших экспериментах с .NET Core и Docker!