EC2 환경에서 docker로 무중단 배포 과정 중 ScriptTimedOut 오류(Docker 권한 )
EC2 환경에서 nginx, docker로 springboot 프로젝트를 무중단 배포하는 과정에서 무수히 많은 삽질을 경험했다.
먼저 CI/CD는 Travis CI와 AWS S3, CodeDeploy를 사용했다. 배포 스크립트 파일은 해당 레파지토리에서 확인이 가능하다.
ApplicationStart 이벤트가 발생할 때 다음과 같이 ScriptTimedOut 오류가 발생하였다.
CodeDeploy 로그를 보아하니... dockerfile이 빌드될 때 Already exists 메시지를 호출하는 것을 볼 수 있다.
dockerfile로 컨테이너를 빌드하는 과정에서 이미 동일한 이름의 docker 컨테이너가 존재하기 때문에 생성되지 못하고 결국 ScriptTimedOut 오류가 발생한 것으로 추측된다.
알고 보니 stop.sh가 실행될 때 컨테이너를 중지시기고 삭제하는 부분이 제대로 수행되지 않았기 때문에 타임아웃 에러가 난 것이었다...
docker는 기본적으로 root환경에서 실행되기 때문에 sudo 명령어를 사용해야 한다. 스크립트에서는 sudo 명령어가 빠져있으니 당연히 커맨드가 먹히지 않을 수밖에...
Docker 그룹에 사용자 추가하기
ec2-user 사용자를 docker 그룹에 추가해주었다.
sudo usermod -aG docker ec2-user
docker 그룹에 추가하고 docker 서비스를 재시작해주어야 한다.
sudo service docker restart
그리고 마지막에 한번 서버 로그아웃하고 재접속해주면 sudo가 없이도 docker명령어가 잘 먹히는 것을 확인할 수 있다.
+) 이후의 대왕 삽질... docker 권한 수정 후 다시 배포를 시도해보니 확실하게 script에러가 발생하였다.
포트 바인딩이 제대로 안되어있는 건가 싶어서 echo로 로그를 남겨보니 역시나 포트 매핑하는 부분이 비어있는 것을 확인할 수 있었다..^^
원인은 쉘 스크립트에서 바인딩할 포트를 반환하는 함수 호출하는 구문에서 괄호 오타가 나있어서 포트를 제대로 불러오지 못한 것이었다.
아래와 같이 쉘 스크립트에서 함수 호출할 때에는 소괄호를 사용해야 하는데 중괄호{}로 되어있어서 당연히 함수 호출이 안된 것이었다..^^
IDLE_PORT=$(find_idle_port)