ASP.NET 프로젝트를 라즈베리파이에 배포하려 합니다.

ASP.NET Web API 프로젝트를 Github Action을 통해 라즈베리파이 서버에 배포하려고 합니다.
Github Workflow에서 프로젝트가 푸시되면 프로젝트 내부에 있는 도커파일을 빌드하고 서버로 배포하도록 구성했습니다.
서버로 빌드된 이미지가 업로드 되면 컨테이너가 실행되는 데 아래와 같은 경고를 출력하고 컨테이너가 종료되고 있습니다.

WARNING: The requested image’s platform (linux/amd64) does not match the detected host platform (linux/arm64/v8) and no specific platform was requested

Github Workflow

on:
    push:
        branches:
            - deploy

jobs:
    deploy:
        runs-on: ubuntu-latest

        steps:
            # 1. 레포지토리 체크아웃
            - name: Checkout code
              uses: actions/checkout@v3

            # QEMU 설정
            - name: Set up QEMU
              uses: docker/setup-qemu-action@v3

            # Docker buildX 설정
            - name: Setup Buildx
              uses: docker/setup-buildx-action@v3


            # 2. Docker 이미지 빌드
            - name: Build Docker Image for ARM64
              run: |
                docker buildx build --platform linux/arm64 -t myapp -f MyApp.API/Dockerfile .

            # 3. Docker 이미지 전송
            - name: Push Docker Image to Raspberry Pi
              env:
                SSH_KEY: ${{ secrets.HOME_SERVER_SSH_KEY }}
                HOST_NAME_IP: ${{ secrets.HOST_NAME_IP }}
              run: |
                # SSH 설정
                mkdir -p ~/.ssh
                echo "$SSH_KEY" > ~/.ssh/id_rsa
                chmod 600 ~/.ssh/id_rsa
                # OpenSSH를 사용해 Docker 이미지를 Raspberry Pi에 전송
                docker save myapp | ssh -o StrictHostKeyChecking=no -i ~/.ssh/id_rsa -p 55555 $HOST_NAME_IP "docker load"
              
            # 4. 컨테이너 실행
            - name: Deploy Docker Container
              env:
                HOST_NAME_IP: ${{ secrets.HOST_NAME_IP }}
              run: |
                # SSH를 사용하여 Raspberry Pi에서 컨테이너 실행
                ssh -o StrictHostKeyChecking=no -i ~/.ssh/id_rsa -p 55555 $HOST_NAME_IP "
                  docker stop myapp || true &&
                  docker rm myapp || true &&
                  docker run -d --name MyApp.API -p 8080:8080 myapp
                "

Dockerfile

FROM mcr.microsoft.com/dotnet/aspnet:9.0-bookworm-slim-arm64v8 AS base
USER $APP_UID
WORKDIR /app
EXPOSE 8080

FROM mcr.microsoft.com/dotnet/sdk:9.0-bookworm-slim-arm64v8 AS build
ARG BUILD_CONFIGURATION=Release
WORKDIR /src
COPY ["MyApp.API/MyApp.API.csproj", "MyApp.API/"]
RUN dotnet restore "./MyApp.API/MyApp.API.csproj"
COPY . .
WORKDIR "/src/MyApp.API"
RUN dotnet build "./MyApp.API.csproj" -c $BUILD_CONFIGURATION -o /app/build

FROM build AS publish
ARG BUILD_CONFIGURATION=Release
RUN dotnet publish "./MyApp.API.csproj" -c $BUILD_CONFIGURATION -o /app/publish /p:UseAppHost=false

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

서버의 운영체제는 Debian 12이고 arm64 아키텍쳐를 사용하고 있습니다.
런타임과 컴파일 이미지 모두 .NET Docker Images에서 9.0-bookworm-slim-arm64v8을 사용하였습니다.

서버에 빌드된 이미지가 업로드되고 컨테이너가 생성되면 아래와 같은 경고가 발생하고 컨테이너가 종료됩니다.

.NET 프로젝트를 개발환경과 다른 아키텍쳐에 배포하는 자료가 있을까요? 플랫폼 문제만 해결하면 될거같아서 며칠째 이것만 붙잡고 있는데 잘 안되고 있습니다…

GitHub Action은 기본적으로 amd64 (x64)로 바이너리를 빌드합니다. 이렇게 만들어진 바이너리를 arm64를 사용하는 라즈베리 파이로 배포하려고 하면 당연히 CPU 아키텍처가 달라서 실행이 불가능한게 맞습니다.

ARM64 환경에서 실행되는 GitHub Action Runner가 최근에 발표되었으니, 아래 레퍼런스 문서를 참고해서 amd64가 아닌 arm64 기반으로 Runner를 배정해서 실행하도록 워크플로우 yaml 문서를 고쳐보시면 해결될 것 같습니다.

6개의 좋아요

깃헙 액션이나 도커는 써본 적이 없는데
라즈베리파이4에 asp.net 서버는 올려 본적 있습니다.

arm64 .net 설치 후 정상 작동 했었습니다.

CI/CD 작업까진 하지않았지만, 경험상 그냥 x64윈도우 환경에서 arm32컨테이너를 말아서 라즈베리에 구동도 가능 했었습니다.

warring이 도커와 닷넷중 어디서 발생하는지는 모르겠지만
dotnet publish할때 -r linux-arm64 를 명시해줘보면 어떨까요

1개의 좋아요

며칠전에 공유해주셨던 아래 포스팅글을 확인했었습니다.

아직 비공개 레포지토리에서는 지원되지 않는 기술인것 같습니다ㅠㅠ

혹시나 해서 실제로 사용해봤는데 사용이 안되네요
image

1개의 좋아요

혹시 도움이 될까봐 가져왔습니다. 직접 해본거는 아니에요.

네 맞습니다. 지금 시점에선 기업/팀 플랜에서만 이용가능하며, 개인 플랜에서의 지원은 한창 진행중에 있습니다.