Dev/삽질기록

EC2 환경에서 docker로 무중단 배포 과정 중 ScriptTimedOut 오류(Docker 권한 )

ssyoni 2022. 4. 15. 10:48
반응형

EC2 환경에서 nginx, docker로 springboot 프로젝트를 무중단 배포하는 과정에서 무수히 많은 삽질을 경험했다. 

먼저 CI/CD는 Travis CI와 AWS S3, CodeDeploy를 사용했다. 배포 스크립트 파일은 해당 레파지토리에서 확인이 가능하다. 

 

ApplicationStart 이벤트가 발생할 때 다음과 같이 ScriptTimedOut 오류가 발생하였다. 

AWS -> CodeDeploy -> 배포

 

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)
반응형