はなちるのマイノート

Unityをメインとした技術ブログ。自分らしくまったりやっていきたいと思いますー!

【Docker, C#】Docker buildで「--platform linux/amd64」を指定した際にdotnet restoreでスタックしてしまう対策

はじめに

Cloud RunにDocker Imageをアップロードしようとしたところ、M1 Macでビルドする際には以下のオプションを利用しないとダメなことに気が付きました。

$ docker build ./ -t hoge --platform linux/amd64

ただし以下のDockerfileだとdotnet restoreでずっとビルドが進まなくなってしまいました。

FROM mcr.microsoft.com/dotnet/sdk:8.0 AS build-env
WORKDIR /App

COPY . ./

RUN dotnet restore
RUN dotnet publish -c Release -o out

FROM mcr.microsoft.com/dotnet/aspnet:8.0
WORKDIR /App
COPY --from=build-env /App/out .
ENTRYPOINT ["dotnet", "CloudRunSample.dll"]

その解決方法がわかったので書き残しておきたいと思います。

解決方法

以下の4つの対応をしました。

  • FROM mcr.microsoft.com/dotnet/sdk:8.0--platform=$BUILDPLATFORMを追加する
  • ARG TARGETARCHを追加する
  • dotnet restoreのオプションに-a $TARGETARCHを追加する
  • dotnet publishのオプションに-a $TARGETARCHを追加する
FROM --platform=$BUILDPLATFORM mcr.microsoft.com/dotnet/sdk:8.0 AS build-env
ARG TARGETARCH
WORKDIR /App

COPY . ./

RUN dotnet restore -a $TARGETARCH
RUN dotnet publish -c Release -o out -a $TARGETARCH

FROM mcr.microsoft.com/dotnet/aspnet:8.0
WORKDIR /App
COPY --from=build-env /App/out .
ENTRYPOINT ["dotnet", "CloudRunSample.dll"]