본문 바로가기
개발/DevOps

Dockerfile에 환경변수를 추가해보자.

by leedonggeun 2023. 12. 17.
📌 지난 글
1. Dockerfile을 이용해 Docker image 생성해보자.

Docker

지난 글에서는 임의의 애플리케이션을 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라고 표시되는 것을 확인할 수 있습니다. 
이를 통해 우리는 이제 환경변수를 통해 적절한 환경에 맞추어 도커 이미지를 배포할 수 있게 되었습니다.

 

댓글