본문 바로가기
Etc/Docker

[Docker] FastAPI 프로젝트 Docker Bulid 하기

by 천우산__ 2024. 2. 17.

FastAPI로 만든 백엔드 어플리케이션을 만들었다. 완성 까지는 아니지만

주변 사람들에게 이용을 권유 해 보고, 사용자 경험을 토대로 더 수정해 나가고자 현재 단계에서 배포하기로 했다.

배포를 하기 위해서는 다양한 경로와 방법이 있지만

이번 프로젝트는 AWS Elastic Beanstalk 에서 Docker 를 통해 배포해 보기로 했다.

Docker를 통한 배포 방법은 이전에 한 번 경험해 본 적이 있지만 조금 오래 되었기도 했고,

프로젝트 코드를 그대로 배포하는 것과 비교했을 때 설치 버전에 의한 에러 발생 가능성이 낮아 해당 방법을 다시 한 번

사용해 보기로 했다.

 

1. Dockerfile 생성

/backend
.venv
requirement.txt
Dockerfile # 신규 생성
ㄴ app
    ㄴ models
    ㄴ routers
    ...
    main.py
    .env

프로젝트 구조는 아래와 같다.

backend 폴더 내 가상환경 파일, requirement.txt , app 디렉토리가 존재하고

app 디렉토리 내에 FastAPI 프로젝트 코드가 존재한다.

Dockerfile은 app 디렉토리가 존재하는 backend 폴더 바로 아래에 만들어 주고

빌드를 위해 아래와 같이 구성했다.

# 버전 지정
FROM python:3.9

# Time Zone 설정
RUN ln -snf /usr/share/zoneinfo/Asia/Seoul /etc/localtime
RUN echo Asia/Seoul > /etc/timezone

# 디렉토리 지정
WORKDIR /app

# 필요 소스 복사
COPY ./requirement.txt /app
COPY ./app /app

# 패키지 설치
RUN pip install -r requirement.txt

# 프로젝트 실행
CMD ["uvicorn", "main:app", "--reload", "--host", "0.0.0.0", "--port", "80"]

코드에 대한 설명은 생략한다.

위의 방법 그대로 빌드를 하는 경우 한 가지 문제가 발생 할 수 있는데, .env 도 같이 빌드된 다는 것이다.

Docker 로 만들어진 image 파일을 자세하게 확인해보지는 못했지만, 같이 빌드되었다면 확인할 수 있는 방법이 존재할 것이고

.env 파일에 포함된 값들이 누군가가 볼 수 있다는 것은 일반적으로 좋지 않다.

이를 위해 빌드 과정에서 gitignore와 같이 특정 파일을 제외할 수 있는데

.dockerignore 파일을 만든 후 제외할 파일의 위치를 저장해주면 된다.

# backend/.dockerignore 파일

./app/.env

해당 방법으로 .env를 제외하고 빌드한 결과,

docker image 파일을 run 할 경우, env 내 참조된 db 주소를 받아오지 못하여 접속이 불가능한 상황인 점을 확인했다.

다음으로는  AWS EB 배포 후 .env 내 값을 연결해 주는 작업이 필요하다