실행 환경
- OS: MacOS
- FastAPI: 0.96.0 버전
문제 상황
로컬에서 정상적으로 작동하는 FastAPI 애플리케이션을 Docker 이미지로 빌드한 뒤, 컨테이너로 실행시켰더니 ERR_EMPTY_RESPONSE 메세지를 출력하며 아무런 응답을 보내지 않음

# Dockerfile
FROM python:3.10
RUN python3 -m pip install --upgrade pip
COPY ./requirements.txt /ws/requirements.txt
WORKDIR /ws
RUN pip install -r requirements.txt
COPY ./webapp/ /ws
CMD ["uvicorn", "main:app"]
문제 해결
uvicorn을 실행할 때 --host 옵션이 있는데, 이 옵션은 소켓을 바인딩 할 호스트를 지정하는 옵션이다. 기본값이 127.0.0.1이기 때문에 이 옵션을 생략할 경우 FastAPI 애플리케이션은 로컬에서만 접근이 가능해진다. 왜냐하면 127.0.0.1은 localhost 주소이므로 외부와 통신할 수 없기 때문이다. 따라서 로컬에서 실행할 때는 --host 옵션을 주지 않아도 애플리케이션에 접근이 가능했지만, 컨테이너에서 애플리케이션이 실행될 경우 컨테이너 외부에서는 애플리케이션에 접근할 수 없는 것이다.
외부에서 애플리케이션에 접근을 가능하게 하려면 --host 0.0.0.0 옵션을 줘야한다.
따라서 아래와 같이 Dockerfile을 수정하여 문제를 해결했다.
# Dockerfile
FROM python:3.10
RUN python3 -m pip install --upgrade pip
COPY ./requirements.txt /ws/requirements.txt
WORKDIR /ws
RUN pip install -r requirements.txt
COPY ./webapp/ /ws
CMD ["uvicorn", "main:app", "--host", "0.0.0.0"]
'Backend > Trouble Shooting' 카테고리의 다른 글
CLI 명령어가 잘못된 실행 파일을 참조하는 문제 (0) | 2023.12.29 |
---|---|
[Airflow] RuntimeError: Cannot re-initialize CUDA in forked subprocess 에러 해결 (0) | 2023.09.13 |
[문제 해결] GitHub Actions가 작동하지 않는 문제 해결 (0) | 2023.07.30 |
[Python 에러 분석] 직접 구현한 모듈을 import할 때 ModuleNotFoundError가 발생하는 이유 (0) | 2023.07.04 |