[Docker] 도커 이미지 빌드 플랫폼 호환성문제 및 도커 이미지로 fastapi 서버 실행시키기

hyelim·2023년 8월 18일
0
post-thumbnail

에러1

Can not install pymssql on M1 Device

https://github.com/pymssql/pymssql/issues/727 보고 해당 라이브러리에 필요한 시스템종속성을 추가해 해결했다

에러2

fastapi 관련 파일들을 도커 이미지로 빌드하려고 도커 파일을 사용해

이미지를 빌드하고 생성된 이미지로 컨테이너를 실행했는데 실행시키자마자 아래와 같은 오류가 나며 컨테이너가 종료되었다

docker build -t myimage ./
docker run -d --name mycontainer -p 8080:8000 myimage

8080:8000의 의미호스트의 8080번 포트로 들어오는 요청이 컨테이너의 8000번 포트로 전달되며, 애플리케이션은 컨테이너 내부에서 8000번 포트를 사용하여 동작한다는 의미

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

이 경우 호환성 문제이기 때문에 docker build -t myimage ./ --platform linux/arm64 이렇게 각자 환경에 맞게 이미지를 빌드하면된다.

리눅스 서버에서 실행시킬거면 linux/amd64로 지정하면된다

올바른 도커파일생성부터 컨테이너 생성까지 과정

  1. 도커 파일 작성

    FROM python:3.9
    
    RUN apt-get update && \
        apt-get install -y freetds-dev libssl-dev && \
        rm -rf /var/lib/apt/lists/*
    
    ENV LDFLAGS="-L/usr/lib/x86_64-linux-gnu -L/usr/lib/i386-linux-gnu"
    ENV CFLAGS="-I/usr/include"
    
    WORKDIR /app
    
    COPY . .
    
    RUN apt-get update && \
        apt-get install -y freetds-dev libssl-dev && \
        rm -rf /var/lib/apt/lists/*
    
    RUN pip install --no-cache-dir -r requirements.txt
    
    EXPOSE 8000
    
    CMD ["uvicorn", "app.main:app", "--host", "0.0.0.0"]
  2. 이미지 빌드

    docker build -t myimage ./ --platform linux/arm64 .

    docker build -t fastapi:v1 . 다음부터는 이런식으로 유의미한 이미지 이름을 지정하자

  3. 이미지를 컨테이너로 실행

    docker run -d --name ctf -p 8080:8000 myimage

  4. localhost:8080/docs 에 접속하면 정상적으로 동작하는것이 확인가능하다

Dockerfile을 분해해보자

1. python:3.9 이미지는 Python 3.9 버전을 기반으로 한 공식 Docker 이미지를 가져온다

# Use the official Python image
FROM python:3.9

2. 시스템 종속성을 설치하는 부분, apt-get 명령을 사용하여 필요한 패키지들을 설치한다

여기서는 freetds-devlibssl-dev 패키지를 설치

# Install system dependencies
RUN apt-get update && \
    apt-get install -y freetds-dev libssl-dev && \
    rm -rf /var/lib/apt/lists/*

3. 환경 변수를 설정하는 부분

여기서는 ENV 명령을 사용하여 LDFLAGSCFLAGS 환경 변수를 설정

# Set environment variables
ENV LDFLAGS="-L/usr/lib/x86_64-linux-gnu -L/usr/lib/i386-linux-gnu"
ENV CFLAGS="-I/usr/include"

4. 작업 디렉토리를 설정하는 부분

WORKDIR 명령을 사용하여 컨테이너 내부의 현재 작업 디렉토리를 /app으로 설정

# Set working directory
WORKDIR /app

5. 호스트의 현재 디렉토리의 모든 파일을 컨테이너 내부의 /app 디렉토리로 복사

현재 호스트의 작업 디렉토리에 있는 모든 파일과 디렉토리를 Docker 컨테이너의 지정된 작업 디렉토리로 복사하는 역할

# Copy application code
COPY . .

(pymssql 라이브러리에 필요한 시스템 종속성을 설치하는 부분)

# Install system dependencies for pymssql (if needed)
# Replace this with the correct package name if you have a requirements.txt entry for pymssql
RUN apt-get update && \
    apt-get install -y freetds-dev libssl-dev && \
    rm -rf /var/lib/apt/lists/*

6. Python 패키지 의존성을 설치하는 부분

# Install Python dependencies
RUN pip install --no-cache-dir -r requirements.txt

7. 컨테이너 내부에서 열어둘 포트 번호 8000으로 지정

# Expose port
EXPOSE 8000

8. 컨테이너가 실행될 때 수행될 기본 명령을 지정하는 부분

CMD 명령을 사용하여 uvicorn 명령을 실행하도록 설정한다. uvicorn은 ASGI(Asynchronous Server Gateway Interface) 애플리케이션을 실행하는 웹 서버인데,a**pp.main:app**은 FastAPI 애플리케이션의 진입점을 나타내고, --host "0.0.0.0"은 서버를 모든 IP 주소에서 수신 가능하게 설정한다

# Run your application
CMD ["uvicorn", "app.main:app", "--host", "0.0.0.0"]

Docker on Mac M1 gives: "The requested image's platform (linux/amd64) does not match the detected host platform"

가장 빠르게 FastAPI를 돌려보자 - uvicorn-gunicorn-fastapi-docker | Daily Log

[Docker] 이미지 빌드 플랫폼 호환성 관련 에러 (linux/amd64)
https://github.com/pymssql/pymssql/issues/727
https://fastapi.tiangolo.com/deployment/docker/#raspberry-pi-and-other-architectures

profile
기록용

0개의 댓글