github action을 이용하여 docker hub에 푸시했다. 코드상에 문제가 없고, ec2 보안그룹도 제대로 설정했는데 배포한 ip주소에 접속이 되지 않는 문제가 계속해서 발생했다.
해당 IP 주소에 접속하면, 다음과 같은 에러가 발생했다.
연결을 거부했습니다. ERR_CONNECTION_REFUSED
1. 실행중인 컨테이너 확인
docker ps
실행중인 컨테이너가 없다는 사실을 발견했다..!!
2. 전체 컨테이너 확인
docker ps -a
STATUS를 보면, push한 docker container의 상태가 Exited (1) 이다. 컨테이너가 비정상적으로 종료되었다는 의미이다.
3. 해당 컨테이너의 로그를 확인한다.
컨테이너의 로그를 확인하면, 어떤 에러가 발생했는지 구체적으로 확인할 수 있다.
docker logs [CONTAINER ID]
확인 결과, 다음과 같은 에러 메세지를 확인했다.
ERROR : Error loading ASGI app. Could not import module "main"
ASGI 앱을 로드하는 동안 'main' 모듈을 가져올 수 없어서 발생한 에러이다. ASGI 앱이 시작될 때 'main' 모듈을 찾을 수 없는 상황인 것이다.
4. Dockerfile 수정
Dockerfile을 확인해보았다.
FastAPI를 Run하는 명령어가 다음과 같이 작성되어있었다.
CMD uvicorn --host=0.0.0.0 --port 8000 main:app
내 프로그램의 설계 상으로는, main.py 파일은 app 디렉터리 안에 위치해 있다.
따라서, 경로를 아래와 같이 확실하게 다시 설정해주었다.
아래 둘 중 하나로 설정해주면 된다.
CMD uvicorn --host=0.0.0.0 --port 8000 app.main:app
CMD ["uvicorn", "app.main:app", "--host", "0.0.0.0", "--port", "8000"]
이렇게 바꿔주었더니 정상적으로 접속에 성공했다!!
💡 중요
다른 설정에 문제가 전혀 없는데 ERR_CONNECTION_REFUSED 에러가 발생한다면, docker 컨테이너의 로그를 확인해보자!