개발환경
OS: Windows 11
IDE: Spring Tool Suite 4.14.1
JAVA: 17
사전 구성:
어플리케이션에서 발생하는 로그를 logback.xml의 설정을 통해
/log/날짜/어플리케이션명.log 형식으로 저장하고 있음.
logback.xml은 jar와 같은 경로에 있음.
docker run -e [환경변수명]=[값]
목표: 호스트의 logback-spring.xml 파일을 환경변수 형태로 컨테이너에 전달
docker {
println("gradle docker-plugin start = 어플리케이션명:${version}")
name "이미지명:${version}"
files (tasks.bootJar.outputs.files,'C:/Users/letsj/logback-spring.xml')
tag 'DockerHub', "허브경로/이미지명:${version}"
buildArgs(['JAR_FILE': tasks.bootJar.outputs.files.singleFile.name])
}
files
에 전달할 파일 명시('C:/Users/letsj/logback-spring.xml')* 파일에 명시하지 않은 파일은 도커 빌드 시 Dockerfile에서 not found 오류남
(참고: [Docker] Springboot Docker build, docker run image)
FROM openjdk:8-alpine
ARG JAR_FILE=build/libs/어플리케이션명.jar
***ARG LOGBACK=logback-spring.xml***
COPY ${JAR_FILE} 어플리케이션명.jar
***COPY ${LOGBACK} logback-spring.xml***
EXPOSE 6080
VOLUME ["마운트경로"]
ENTRYPOINT ["java", "-jar", "-Dlogging.config=${LOG_BACK}", "/어플리케이션명.jar"]
ARG
로 아규먼트 선언(build.gradle의 docker.files에 명시한 것)COPY
로 파일 복사 → 로컬에서는 [프로젝트 경로/build/docker] 하위에 복사됨. 컨테이너 생성 시엔 루트 경로에 복사됨. 경로 지정 안했기 때문에. ENTRYPOINT
의 커맨드가 컨테이너에서 읽을 파일들임 VOLUME
에 호스트와 공유할 컨테이너 경로 지정 ** 컨테이너 실행 시 -v 옵션을 사용하면 덮어씌워져서 무의미할지도…ENTRYPOINT
의 "-Dlogging.config=${LOG_BACK}": 아래에서 LOG_BACK 이란 환경변수명으로 logback-spring.xml을 전달해서 실행시킬 예정. (이미지 빌드 시 사용하는 LOGBACK 아규먼트와 구분하기 위해 언더바 붙임. 내가 혼란스러움)3-1. 이미지 빌드
빌드 하면 됨.
3-2. 이미지 빌드 확인
Docker Desktop이나 cmd에서 생성된 이미지 확인 가능함
도커 이미지 확인 명령어
docker image ls
docker run --name test33 -e LOG_BACK=logback-spring.xml -v [호스트 경로]:[컨테이너 경로] -p 6088:6080 [이미지명]:[태그]
-e LOG_BACK=logback-spring.xml:
logback-spring.xml을 LOG_BACK이라는 환경변수로 설정하여 전달(logback-spring.xml은 명령어 실행경로에 위치해있음)-v 호스트경로:컨테이너 경로
: 로그 공유를 위해 마운트할 경로 지정. [호스트 경로]:[컨테이너 경로]. (호스트 경로가 C:/User/… 이면 전체 경로 다 적어줘야 함)echo $LOG_BACK
docker exec -it [컨테이너 ID] /bin/sh
→ vi로 출력해보면 COPY한 파일 내용 잘 나옴.
logback.xml에 명시한 로그파일저장경로에서 확인 가능
cd 컨테이너 로그 경로
ls
cd 20220729 # 오늘날짜
→ [~/log] 경로에 로컬의 [~/log] 하위 컨텐츠가 다 들어와 있는 걸 볼 수 있음. 호스트랑 컨테이너랑 잘 공유가 되고 있다는 뜻이겠지…
→ 오늘자(20220729) 폴더 생성 확인 완
Get-Content [출력 대상 파일 경로] -Wait -Tail [n]
# 사용 예)
Get-Content C:\home\...\log\20220729\어플리케이션명.log -Wait -Tail 100
Get-Content
: cat과 동일-Wait
: 파일 출력 대기 상태-Tail
: 파일의 마지막 [n]줄 출력참고: https://jootc.com/p/20180129634
→ API 요청 시 로그가 바로바로 잘 올라온당
참고