프로젝트 배포 단계에서 급하게 https 프로토콜로 바꿔야해서
팀원분이 Spring boot Tomcat 내장 서버에 ssl 인증을 구현해주셨다
그런데 로컬 서버에서는 문제없이 작동하더니 aws ec2에 도커 이미지로 배포하니 에러가 발생했다
Caused by: java.io.FileNotFoundException: /keystore.p12 (No such file or directory)
먼저 프로젝트 resources 폴더 내의 keystroe.p12 파일을 인식하지 못해 생기는 문제로 판단했다
찾아보니 IDE로 실행 시엔 resources 폴더 내의 파일을 인식하지만
빌드 시엔 jar로 패키징된 폴더를 지정해줘야 하기 때문에 classpath:를 달아한다는 것이었다.
// 기존
ssl:
key-store: keystore.p12
key-store-type: PKCS12
// 변경, But 실패
ssl:
key-store: classpath:keystore.p12
key-store-type: PKCS12
경로를 수정해 주었음에도 문제를 해결할 수 없었다. 즉 원인은 경로가 아니었다.
yml 파일을 수정해줬음에도 keystore을 찾을 수 없다는 에러가 그대로 발생하였다
따라서 jar를 빌드할때 resources 폴더 내 template이나 정적 html 파일들은 패키징되나,
resources 폴더의 외부 파일들은 패키징되지 않아서 발생하는 것으로 추측했다
FROM openjdk:11-jdk
ARG JAR_PATH=./build/libs
COPY ${JAR_PATH}/backend-0.0.1-SNAPSHOT.jar application.jar
// 추가
COPY ./src/main/resources/keystore.p12 keystore.p12
ENTRYPOINT ["java", "-jar"]
CMD ["/application.jar"]
// 수정
ssl:
key-store: /keystore.p12
key-store-type: PKCS12
따라서 컨테이너에 keystore을 복사하도록 도커파일을 수정하였다
그럼에도 문제가 해결되지 않았다..
yml 파일을 조금씩 건드리면서 어떤게 문제일까 고민하던 중
팀원분께서 로그 기록을 보니 가장 최근 기록이 현재 시각이랑 다른 걸로 보아
docker container 자체가 올라가지 않는 것 같다고 하셨다
젠킨스 상에서도 일단 빌드는 성공하고, deploy on ssh로 스크립트를 날리는 과정에서 실패하니
당연하게 was를 실행하는 과정에서 오류가 발생한다고 생각했다
아마도 도커 컨테이너를 계속 올려 테스트하는 과정에서 추가적인 문제가 발생한 것으로 보인다
따라서 배포서버로 날릴 스크립트에 배포할 서버와 이름이 같은 기존 컨테이너를 삭제하도록 추가했다
docker ps -q --filter name=[컨테이너명] && docker rm -f $(docker ps -aq --filter name=[컨테이너명]
기존엔 실행 중인 기존 컨테이너가 있을때만 교체하도록 했다면,
이름이 같은 모든 컨테이너를 강제로 종료하는 스크립트로 교체해주었다
결과적으로 성공적으로 해결할 수 있었다
jar파일을 빌드해서 배포하곤 있었지만 정작 jar 파일이 어떻게 빌드되고 구성되는지는 몰랐었다
문제를 해결하는 과정에서 jar, docker에 대해 더 공부할 수 있었다