Docker Spring boot container 자동 빌드 만들기
Docker안녕하세요 Lovefield입니다.
일전에 docker-compose를 이용해 Spring boot를 올리는 방법에 대해서 글을 쓴적이 있습니다. Docker로 마이크로 서비스 환경을 구현하고 관리한다는 것은 좋은 메리트지만, Build 가 필요한 앱의 경우는 꽤나 번거로운 과정이 존재합니다. 리소스를 업데이트 하고, Build를 한다음 컨테이너를 재실행 해야하죠. 심지어 Spring boot의 build 툴같은 경우 캐싱이 되어있지 않으면 모든 모듈을 다운로드 받기 시작합니다. 컨테이너를 삭제하고 다시만드는 Docker의 특성상 캐싱이 될리 만무하죠.
그래서, Docker의 volumes와 Git hook을 이용해서 Spring boot container를 자동으로 빌드하고 재시작 하는 환경을 구성하려고 합니다.
가장먼저 docker-compose.yml
을 수정합니다.
…
spring:
container_name: appname
image: openjdk:11.0.7-jdk-slim
volumes:
- ./appname:/spring
- ~/.gradle:/root/.gradle:rw # 캐시 폴더
working_dir: /spring
command: java -jar ./build/libs/appname-0.0.1-SNAPSHOT.jar
…
image는 openjdk:11.0.7-jdk-slim
을 사용했습니다. 여기서 중요한 것은 jdk를 사용하셔야 빌드를 위한 도구가 있다는 점입니다. 실행용인 jre를 사용하실 경우 빌드가 돌지 않으니 주의해주세요. 이미지 용량을 줄이기 위해 slim 버전을 사용합니다.
Mac 기준 ~/.gradle
은 Gradle이 빌드할때 사용한 캐시가 저장되는 공간입니다. 그리고 container의 /root/.gradle
은 container 안에서 명령어를 실행할 경우 Gradle이 캐시를 찾는 위치죠. 즉 캐싱 데이터를 container와 로컬을 동기화 시켜줍니다.
이제 container는 로컬 환경과 Gradle 캐시가 동기화 되었습니다. Git hook으로 pull 과 checkout을 사용할 때 컨테이너 내에서 빌드를 하고 해당 컨테이너를 재실행 시켜 변경점이 적용 되도록 할 생각입니다.
Git hook 파일로는 post-checkout
와 post-merge
를 생성해줍니다. 기본적인 Git hook 경로는 .git/hooks
입니다. 각각의 파일에 다음 명령어들을 기입합니다.
docker exec appname ./gradlew build -x test && docker-compose restart spring
이제 모든 설정이 끝났습니다. spring 레포에서 pull 이나 checkout을 사용할 경우 Build후 restart하는 모습을 볼 수 있습니다.