📌 지난 글
1. Dockerfile을 이용해 Docker image 생성해보자.
지난 글에서는 임의의 애플리케이션을 Dockerfile을 통해 Docker Image를 생성하는 것을 알아봤습니다.
하지만 운영할 땐 단순히 Application을 띄우는 것이 아니라 여러 가지 환경변수 등을 주입해줘야 합니다.
예를 들어, 개발환경이냐 운영환경이냐에 대한 spring profiles가 그 대표적인 예일 것입니다.
이에, 우리는 이번 게시글을 통해 Dockerfile에 환경 변수를 주입하는 법을 확인하고자 합니다.
1. 지난 글에서 생성한 Dockerfile
아래의 Dockerfile은
1. Amazon Corretto JDK 17을 가지고 있는 경량화 리눅스(Alpine)에
2. 빌드된 spring boot application을 / 경로에 저장 후
3. 컨테이너가 실행될 때(ENTRYPOINT) java - jar /application.jar 명령어를 수행한다.
라는 간단한 파일입니다.
FROM amazoncorretto:17-alpine-jdk
LABEL maintainer="LEE DONGGEUN <dglee.dev@gmail.com>"
LABEL version="1.0.0"
LABEL description="Spring Boot Dockerfile Practice"
# JAR_FILE을 application.jar로 복사
COPY build/libs/*.jar application.jar
ENTRYPOINT ["java", "-jar", "/application.jar"]
2. Dockerfile 수정하기
위에서 작성한 Dockerfile을 토대로, 몇몇 부분만 수정해 줍니다.
1. SPRING_PROFILE=LOCAL이라는 ENV를 선언합니다. 이는 container를 실행할 때 옵션을 주지 않으면 LOCAL이 default로 설정되도록 선언한 것입니다.
2. ENTRYPOINT에 active profile을 설정합니다.
FROM amazoncorretto:17-alpine-jdk
LABEL maintainer="LEE DONGGEUN <dglee.dev@gmail.com>"
LABEL version="1.0.0"
LABEL description="Spring Boot Dockerfile Practice"
COPY ./build/libs/*.jar application.jar
# 환경변수 선언
ENV SPRING_PROFILE=LOCAL
# 환경변수를 이용
ENTRYPOINT ["java", "-Dspring.profiles.active=${SPRING_PROFILE}", "-jar", "/application.jar"]
3. Dockerfile 빌드하기
수정한 Dockerfile을 사용하도록 다시 빌드해 줍니다.
# 기존 Docker Image 삭제
$ docker rmi practice:1.0.0
Untagged: practice:1.0.0
Deleted: sha256:6cb5f6ae2c1e50b0f072406c704b7eb690cfaa625f708ef92ee21d1786e8747d
# Docker Image 다시 빌드
$ docker buildx build -t practice:1.0.0 .
[+] Building 23.8s (7/7) FINISHED docker:default
=> [internal] load build definition from Dockerfile 0.2s
=> => transferring dockerfile: 375B 0.0s
=> [internal] load .dockerignore 0.2s
=> => transferring context: 2B 0.0s
=> [internal] load metadata for docker.io/library/amazoncorretto:21-alpine-jdk 2.7s
=> [internal] load build context 0.6s
=> => transferring context: 19.78MB 0.5s
=> [1/2] FROM docker.io/library/amazoncorretto:21-alpine-jdk@sha256:6a11101b77ee8e6dfb0c60cf804f58549d06a960f73fd6761799880aa42ec117 19.0s
=> => resolve docker.io/library/amazoncorretto:21-alpine-jdk@sha256:6a11101b77ee8e6dfb0c60cf804f58549d06a960f73fd6761799880aa42ec117 0.1s
=> => sha256:323a6520ab1dabd6c1420c02a0844e6a44a39d0a19f78f64c4344e2cb08b2389 159.21MB / 159.21MB 16.2s
=> => sha256:6a11101b77ee8e6dfb0c60cf804f58549d06a960f73fd6761799880aa42ec117 547B / 547B 0.0s
=> => sha256:e937a2668732ad0e138180f40e26586b4ba39282271889466ce6693410b77f2c 741B / 741B 0.0s
=> => sha256:fa05e5ac000fa48bb2567957243a04209c486db94f684026fe1a43ff3313396b 3.39kB / 3.39kB 0.0s
=> => sha256:c926b61bad3b94ae7351bafd0c184c159ebf0643b085f7ef1d47ecdc7316833c 3.40MB / 3.40MB 0.7s
=> => extracting sha256:c926b61bad3b94ae7351bafd0c184c159ebf0643b085f7ef1d47ecdc7316833c 0.1s
=> => extracting sha256:323a6520ab1dabd6c1420c02a0844e6a44a39d0a19f78f64c4344e2cb08b2389 2.3s
=> [2/2] COPY ./build/libs/*.jar application.jar 1.6s
=> exporting to image 0.2s
=> => exporting layers 0.2s
=> => writing image sha256:6cb5f6ae2c1e50b0f072406c704b7eb690cfaa625f708ef92ee21d1786e8747d 0.0s
=> => naming to docker.io/library/practice:1.0.0
4. Docker 컨테이너 실행하기
docker container를 실행할 때 -e 옵션을 주어 SPRING_PROFILE을 PROD로 설정 후 로그를 확인합니다.
# 도커 컨테이너 실행
$ docker run -d -p 8080:8080 --rm --name practice -e SPRING_PROFILE=PROD practice:1.0.0
de7962e6fe1acbea72de7fce1fcaff3f8311a0186432a0cbd2bfc00c254964a8
# 도커 컨테이너 로그 확인
$ docker logs -f practice
. ____ _ __ _ _
/\\ / ___'_ __ _ _(_)_ __ __ _ \ \ \ \
( ( )\___ | '_ | '_| | '_ \/ _` | \ \ \ \
\\/ ___)| |_)| | | | | || (_| | ) ) ) )
' |____| .__|_| |_|_| |_\__, | / / / /
=========|_|==============|___/=/_/_/_/
:: Spring Boot :: (v3.2.0)
2023-12-17T06:49:53.384Z INFO 1 --- [ main] k.c.dglee.docker.StudyDockerApplication : Starting StudyDockerApplication v0.0.1 using Java 21.0.1 with PID 1 (/application.jar started by root in /)
2023-12-17T06:49:53.387Z INFO 1 --- [ main] k.c.dglee.docker.StudyDockerApplication : The following 1 profile is active: "PROD"
2023-12-17T06:49:54.229Z INFO 1 --- [ main] o.s.b.w.embedded.tomcat.TomcatWebServer : Tomcat initialized with port 8080 (http)
2023-12-17T06:49:54.237Z INFO 1 --- [ main] o.apache.catalina.core.StandardService : Starting service [Tomcat]
2023-12-17T06:49:54.238Z INFO 1 --- [ main] o.apache.catalina.core.StandardEngine : Starting Servlet engine: [Apache Tomcat/10.1.16]
2023-12-17T06:49:54.270Z INFO 1 --- [ main] o.a.c.c.C.[Tomcat].[localhost].[/] : Initializing Spring embedded WebApplicationContext
2023-12-17T06:49:54.271Z INFO 1 --- [ main] w.s.c.ServletWebServerApplicationContext : Root WebApplicationContext: initialization completed in 821 ms
2023-12-17T06:49:54.607Z INFO 1 --- [ main] o.s.b.w.embedded.tomcat.TomcatWebServer : Tomcat started on port 8080 (http) with context path ''
2023-12-17T06:49:54.619Z INFO 1 --- [ main] k.c.dglee.docker.StudyDockerApplication : Started StudyDockerApplication in 1.686 seconds (process running for 2.084)
5. 결과
로그를 확인하면, active 된 profile이 PROD라고 표시되는 것을 확인할 수 있습니다.
이를 통해 우리는 이제 환경변수를 통해 적절한 환경에 맞추어 도커 이미지를 배포할 수 있게 되었습니다.
'개발 > DevOps' 카테고리의 다른 글
Dockerfile을 이용해 Docker image 생성해보자. (1) | 2023.12.04 |
---|---|
ChatGPT-4(챗지피티4)를 무료로 사용해보자 - 뤼튼 (0) | 2023.09.14 |
Docker의 Root Directory 위치를 변경해보자. (0) | 2023.04.24 |
Jenkins public key 변경하기 (2) | 2023.04.07 |
개발 서버를 무료로 배포하고 싶을 땐? (0) | 2023.02.27 |
댓글