[Docker] 도커 컨테이너 실행 시 환경변수 전달

아무튼 간에·2022년 8월 8일
1

개발환경
OS: Windows 11
IDE: Spring Tool Suite 4.14.1
JAVA: 17

Notion으로 더 편하게 보기(클릭)


사전 구성:
어플리케이션에서 발생하는 로그를 logback.xml의 설정을 통해
/log/날짜/어플리케이션명.log 형식으로 저장하고 있음.
logback.xml은 jar와 같은 경로에 있음.


형식

docker run -e [환경변수명]=[] 

목표: 호스트의 logback-spring.xml 파일을 환경변수 형태로 컨테이너에 전달

1. build.gradle수정

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)

2. Dockerfile 수정

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. 이미지 빌드

3-1. 이미지 빌드

빌드 하면 됨.

3-2. 이미지 빌드 확인

  • Docker Desktop이나 cmd에서 생성된 이미지 확인 가능함

    • 도커 이미지 확인 명령어

      docker image ls

4. 컨테이너 실행

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/… 이면 전체 경로 다 적어줘야 함)
    • Dockerfile에서 명시해준 경로와 같긴 하지만 아마 한번 더 덮어씌워졌을 듯. 확인 필요.

5. 컨테이너에서 환경변수 확인

echo $LOG_BACK

  • 참고: docker container cli 실행: docker exec -it [컨테이너 ID] /bin/sh

→ vi로 출력해보면 COPY한 파일 내용 잘 나옴.

6. 컨테이너 로그 확인

logback.xml에 명시한 로그파일저장경로에서 확인 가능

cd 컨테이너 로그 경로
ls
cd 20220729 # 오늘날짜

→ [~/log] 경로에 로컬의 [~/log] 하위 컨텐츠가 다 들어와 있는 걸 볼 수 있음. 호스트랑 컨테이너랑 잘 공유가 되고 있다는 뜻이겠지…

7. 호스트 로그 확인

→ 오늘자(20220729) 폴더 생성 확인 완

8. 호스트에서 실시간 로그 확인(feat. Windows PowerShell)

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 요청 시 로그가 바로바로 잘 올라온당


참고

profile
armton garnet

0개의 댓글