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