-FROM mcr.microsoft.com/dotnet/core/sdk:3.1 AS build
+FROM --platform=$BUILDPLATFORM mcr.microsoft.com/dotnet/core/sdk:3.1 AS build
+
+# See for all possible platforms
+# https://github.com/containerd/containerd/blob/master/platforms/platforms.go#L17
+ARG TARGETARCH
+
WORKDIR /source
# Copy csproj and restore.
COPY src/Impostor.Shared/Impostor.Shared.csproj ./src/Impostor.Shared/Impostor.Shared.csproj
COPY submodules/Hazel-Networking/Hazel/Hazel.csproj ./submodules/Hazel-Networking/Hazel/Hazel.csproj
-RUN dotnet restore -r linux-musl-x64 ./src/Impostor.Server/Impostor.Server.csproj && \
- dotnet restore -r linux-musl-x64 ./src/Impostor.Shared/Impostor.Shared.csproj && \
- dotnet restore -r linux-musl-x64 ./submodules/Hazel-Networking/Hazel/Hazel.csproj
+RUN case "$TARGETARCH" in \
+ amd64) NETCORE_PLATFORM='linux-x64';; \
+ arm64) NETCORE_PLATFORM='linux-arm64';; \
+ arm) NETCORE_PLATFORM='linux-arm';; \
+ *) echo "unsupported architecture"; exit 1 ;; \
+ esac && \
+ dotnet restore -r "$NETCORE_PLATFORM" ./src/Impostor.Server/Impostor.Server.csproj && \
+ dotnet restore -r "$NETCORE_PLATFORM" ./src/Impostor.Shared/Impostor.Shared.csproj && \
+ dotnet restore -r "$NETCORE_PLATFORM" ./submodules/Hazel-Networking/Hazel/Hazel.csproj
# Copy everything else.
COPY submodules/. ./submodules/
COPY src/. ./src/
-RUN dotnet publish -c release -o /app -r linux-musl-x64 --no-restore ./src/Impostor.Server/Impostor.Server.csproj
+RUN case "$TARGETARCH" in \
+ amd64) NETCORE_PLATFORM='linux-x64';; \
+ arm64) NETCORE_PLATFORM='linux-arm64';; \
+ arm) NETCORE_PLATFORM='linux-arm';; \
+ *) echo "unsupported architecture"; exit 1 ;; \
+ esac && \
+ dotnet publish -c release -o /app -r "$NETCORE_PLATFORM" --no-restore ./src/Impostor.Server/Impostor.Server.csproj
# Final image.
-FROM mcr.microsoft.com/dotnet/core/runtime-deps:3.1-alpine
+FROM mcr.microsoft.com/dotnet/core/runtime-deps:3.1
WORKDIR /app
COPY --from=build /app ./
EXPOSE 22023/udp