본문 바로가기
개발/아키텍처

ECS 인스턴스 Docker에 컨테이너 안 올라갈 경우 (Feat. ECR, Jenkins, Gradle) - war 파일

by Devsong26 2021. 9. 7.

ECS와 ECR를 사용 중이며 Jenkins로 배포를 한다.

프로젝트 빌드 툴: Gradle

 

Specification

Docker: 19.03.13-ce

Gradle: 4.4

ECS 에이전트: 1.48.1

 

Jenkins는 파이프라인을 사용하며 아래 절차를 따른다.

- Gradle로 프로젝트 빌드 -> war

- Docker Image 생성 -> ECR latest push

- ECS에 latest image를 사용하여 도커 컨테이너 생성

 

절차 중에 Docker Image Build 후 푸시가 안되는 상황이 발생했다.

어떻게 해결해야 할까?

 

 


 

문제는 Gradle 버전으로 인해 build 시 생성되는 war 파일명 때문이었다.

 

build.gradle의 war.archiveName로 설정할 수 있다.

war{
	archiveName = "demo.war"
}

 

docker build -t 를 이용하여 이미지를 생성할 때, 도커파일을 사용한다.

이때, war 파일을 사용하는 코드에서 문제가 발생했다.

 

# Dockerfile
ADD build/libs/demo.war $CATALINA_HOME/webapps/ROOT.war
# Jenkins Error
ADD failed: stat /var/lib/docker/tmp/docker-builder734073829/build/libs/demo.war: no such file or directory

 

검색을 해봐도 애매한 답 밖에 안 나온다.

직접 디버깅을 해야 하는 상황이다.

 

젠킨스 로그를 보면 젠킨스 서버의 워크스페이스 경로를 확인할 수 있고, war 파일도 확인 가능하다.

# Jenkins Log
/var/lib/jenkins/workspace/demo/~

"/workspace/"로 검색하여 찾을 수 있다.

필자와 jenkins 경로가 다를 수 있다.

 

확인한 war 파일명이다.

demo-1.0.1-SNAPSHOT.war

 

gradle 4.1로 빌드 시 archiveName으로 war 파일이 생성되지만 4.4는 "archiveName-version.war"로 파일을 생성한다.

version은 build.gradle에 설정한 값이다.

 

그러므로 도커파일에서 war명을 "archiveName-version.war"로 바꿔주면 해결된다.

# Dockerfile
ADD build/libs/demo-1.0.1-SNAPSHOT.war $CATALINA_HOME/webapps/ROOT.war