๋ณธ๋ฌธ ๋ฐ”๋กœ๊ฐ€๊ธฐ

Spring & Spring Boot

[CI/CD] ์‹ค์‹œ๊ฐ„ ์ฑ„ํŒ… ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ํ”„๋กœ์ ํŠธ - CI/CD๋ฅผ ์œ„ํ•œ Dockerfile ์ž‘์„ฑํ•˜๊ธฐ

๐Ÿ“– ๋ชฉ์ฐจ

 

 

 


 

์ง€๋‚œ ํฌ์ŠคํŒ…์—์„œ GitHub Actions๋ฅผ ํ™œ์šฉํ•ด CI/CD ํŒŒ์ดํ”„๋ผ์ธ์„ ๊ตฌ์ถ•ํ•ด ๋ณด์•˜๋‹ค.

[CI/CD] ์‹ค์‹œ๊ฐ„ ์ฑ„ํŒ… ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ํ”„๋กœ์ ํŠธ - GitHub Actions๋ฅผ ํ†ตํ•œ CI/CD ๊ตฌ์ถ•ํ•˜๊ธฐ - (2)

 

 

์ด๋ฒˆ ํฌ์ŠคํŒ…์—์„œ๋Š” Dockerfile์„ ์ž‘์„ฑํ•˜๋Š” ๋ฐฉ๋ฒ•์— ๋Œ€ํ•ด ์•Œ์•„๋ณด์ž.

 

 

 

 

 

 

 


 

 

 

 

 

 

 

๐Ÿ“Œ  Dockerfile์ด๋ž€?

  Dockerfile์€ Docker์—์„œ ์ด๋ฏธ์ง€๋ฅผ ์ƒ์„ฑํ•˜๊ธฐ ์œ„ํ•œ ์šฉ๋„๋กœ ์ž‘์„ฑํ•˜๋Š” ์Šคํฌ๋ฆฝํŠธ(์„ค์ •ํŒŒ์ผ)์ด๋‹ค. FROM, RUN, COPY ๋“ฑ์˜ ๋ช…๋ น์–ด๋ฅผ ํฌํ•จํ•˜๋ฉฐ, ์ด ๋ช…๋ น์–ด๋“ค์„ ์ˆœ์„œ๋Œ€๋กœ ์‹คํ–‰ํ•˜์—ฌ ์ปจํ…Œ์ด๋„ˆ ํ™˜๊ฒฝ์— ํ•„์š”ํ•œ ๋ชจ๋“  ์š”์†Œ๋ฅผ ๋‹ด์€ ์ด๋ฏธ์ง€๋ฅผ ๋นŒ๋“œํ•œ๋‹ค.

 

Dockerfile์„ ์ž‘์„ฑํ•˜๊ธฐ ์ „์—, Dockerfile์„ ์ž‘์„ฑํ•˜๋ฉด ์–ด๋–ค ์žฅ์ ์ด ์žˆ๋Š”์ง€ ํ™•์ธํ•ด ๋ณด์ž.

1๏ธโƒฃ ์ด๋ฏธ์ง€ ๋นŒ๋“œ ์ž๋™ํ™” ๋ฐ ์ผ๊ด€์„ฑ ์œ ์ง€
Dockerfile์€ ์ด๋ฏธ์ง€ ๋นŒ๋“œ ๊ณผ์ •์„ ์ˆœ์„œ๋Œ€๋กœ ์ •์˜ํ•˜๋Š” ์Šคํฌ๋ฆฝํŠธ์ด๊ธฐ ๋•Œ๋ฌธ์— ์ด ํŒŒ์ผ์„ ํ†ตํ•ด ์–ธ์ œ๋“ ์ง€ ๋™์ผํ•œ ๋ฐฉ์‹์œผ๋กœ ์ด๋ฏธ์ง€๋ฅผ ์ƒ์„ฑํ•  ์ˆ˜ ์žˆ๋‹ค. ์ด๋Š” ์ˆ˜๋™์œผ๋กœ ์ด๋ฏธ์ง€๋ฅผ ์ƒ์„ฑํ•˜๋Š” ๋ฒˆ๊ฑฐ๋กœ์›€์„ ์ค„์—ฌ์ค€๋‹ค.

2๏ธโƒฃ ๊ฐœ๋ฐœ ํ™˜๊ฒฝ์˜ ํ‘œ์ค€ํ™” ๋ฐ ํ˜‘์—… ํšจ์œจ ์ฆ๋Œ€
Dockerfile์„ ์‚ฌ์šฉํ•˜๋ฉด ๋ชจ๋“  ๊ฐœ๋ฐœ ํ™˜๊ฒฝ๊ณผ ์šด์˜ ํ™˜๊ฒฝ์—์„œ ๋™์ผํ•œ ํ™˜๊ฒฝ์„ ๋ณด์žฅํ•˜์—ฌ ์ผ๊ด€์„ฑ์„ ์œ ์ง€ํ•  ์ˆ˜ ์žˆ๋„๋ก ํ•ด์ฃผ๋ฉฐ, ๊ทธ์— ๋”ฐ๋ผ ํ˜‘์—…์˜ ํšจ์œจ์„ฑ์„ ๋†’์ผ ์ˆ˜ ์žˆ๋‹ค.

3๏ธโƒฃ CI/CD ํŒŒ์ดํ”„๋ผ์ธ ์—ฐ๋™ ๋ฐ ์ง€์†์ ์ธ ๋ฐฐํฌ
Dockerfile์€ Git๊ณผ ๊ฐ™์€ ๊ฐœ๋ฐœ ๋„๊ตฌ๋‚˜ CI/CD ๋„๊ตฌ์™€ ์—ฐ๋™ํ•˜์—ฌ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์˜ ๋นŒ๋“œ ๋ฐ ๋ฐฐํฌ ๊ณผ์ •์„ ์ž๋™ํ™”ํ•˜๋Š” ๋ฐ ํ•„์ˆ˜์ ์ด๋‹ค.
์ด๋ฅผ ํ†ตํ•ด ์ฝ”๋“œ ๋ณ€๊ฒฝ์ด ์žˆ์„ ๋•Œ๋งˆ๋‹ค ์ž๋™์œผ๋กœ ์ด๋ฏธ์ง€๋ฅผ ๋นŒ๋“œํ•˜๊ณ  ๋ฐฐํฌํ•˜๋Š” ์ง€์†์ ์ธ ๋ฐฐํฌ ์‹œ์Šคํ…œ์„ ํšจ์œจ์ ์œผ๋กœ ๊ตฌ์ถ•ํ•  ์ˆ˜ ์žˆ๋‹ค.

 

 

 

 

 

 

 

๐Ÿ“Œ  Dockerfile ์ƒ์„ฑํ•˜๊ธฐ

  ์ด์ œ ์ง์ ‘ Dockerfile์„ ์ƒ์„ฑํ•ด ๋ณด์ž. ์ง„ํ–‰ํ•  ํ”„๋กœ์ ํŠธ์˜ ๋ฃจํŠธ ๋””๋ ‰ํ„ฐ๋ฆฌ์— Dockerfile์„ ์ƒ์„ฑํ•œ๋‹ค. 

<Dockerfile ์ƒ์„ฑ ๊ฒฝ๋กœ>

 

 

 

 

 

 

 

๐Ÿ“Œ  Dockerfile ์ž‘์„ฑํ•˜๊ธฐ

  Dockerfile์„ ์ƒ์„ฑํ–ˆ๋‹ค๋ฉด, ์–ด๋–ค ๋ฐฉ์‹์œผ๋กœ ์ž‘์„ฑํ• ์ง€ ๊ตฌ์„ฑํ•œ ๋’ค์— ์ž‘์„ฑํ•ด ๋ณด๋„๋ก ํ•˜์ž.

๊ธฐ์กด์— ์ง„ํ–‰ํ–ˆ๋˜ ์—ฌ๋Ÿฌ ํ”„๋กœ์ ํŠธ์—์„œ๋Š” ์ด๋ฏธ์ง€ ๋นŒ๋“œ ๋‹จ๊ณ„์™€ ์‹คํ–‰ ๋‹จ๊ณ„๋ฅผ ๋”ฐ๋กœ ๋‚˜๋ˆ„์ง€ ์•Š๊ณ  ์ž‘์„ฑํ–ˆ์—ˆ๋Š”๋ฐ, ์ด๋ฒˆ ํ”„๋กœ์ ํŠธ์—์„œ๋Š” 'Build Stage' ๊ณผ์ •๊ณผ 'Run Stage' ๊ณผ์ •์„ ๋‚˜๋ˆ„์–ด 'Multi-Stage Build' ๋ฐฉ์‹์œผ๋กœ ๊ตฌ์„ฑํ•ด ๋ณด์•˜๋‹ค.

 

๐Ÿ’ก Multi-Stage Build๋ž€?
* ์ปจํ…Œ์ด๋„ˆ ์ด๋ฏธ์ง€๋ฅผ ๋งŒ๋“ค๋ฉด์„œ ๋นŒ๋“œํ•  ๋•Œ(Build)์™€ ์ปจํ…Œ์ด๋„ˆ ์‹คํ–‰ ์‹œ(Run)์— ํ•„์š” ์—†๋Š” ํ™˜๊ฒฝ์„ ์ œ๊ฑฐํ•  ์ˆ˜ ์žˆ๋„๋ก ๋‹จ๊ณ„๋ฅผ ๋‚˜๋ˆ„์–ด ์ด๋ฏธ์ง€๋ฅผ ๋งŒ๋“œ๋Š” ๋ฐฉ๋ฒ•

 

 

์ด๋ ‡๊ฒŒ ๋ฉ€ํ‹ฐ์Šคํ…Œ์ด์ง€ ๋นŒ๋“œ๋ฅผ ์‚ฌ์šฉํ•˜๊ฒŒ ๋˜๋ฉด ๋ถˆํ•„์š”ํ•œ ํŒŒ์ผ์ด ๋‚จ์ง€ ์•Š์•„ ์ตœ์ข… ์ด๋ฏธ์ง€์˜ ์šฉ๋Ÿ‰์ด ์ž‘์•„์ง€๋ฉฐ ์ข€ ๋” ๊ฐ€๋ฒผ์šด ํฌ๊ธฐ์˜ ์ปจํ…Œ์ด๋„ˆ๋ฅผ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๊ฒŒ ๋˜๊ณ , ๊ทธ์— ๋”ฐ๋ฅธ ์ด๋ฏธ์ง€ ์ตœ์ ํ™”๊ฐ€ ๊ฐ€๋Šฅํ•˜๋‹ค. ๋˜ํ•œ, ๋ณด์•ˆ๊ณผ ๋ฐฐํฌ ๊ด€์ ์—์„œ๋„ ์—ฌ๋Ÿฌ ์žฅ์ ์ด ์žˆ๋‹ค.

 

 

 

 

 

โœ”๏ธ ์ด์ œ ๋ฉ€ํ‹ฐ ์Šคํ…Œ์ด์ง€ ๋ฐฉ์‹์œผ๋กœ Dockerfile์„ ์ž‘์„ฑํ•ด ๋ณด์ž.

# Build Stage
FROM eclipse-temurin:17-jdk AS build
WORKDIR /app

COPY . .
RUN chmod +x gradlew
RUN ./gradlew clean build -x test --no-daemon

 

  • FROM eclipse-temurin:17-jdk AS build
    → OpenJDK 17์ด ํฌํ•จ๋œ Eclipse Temurin JDK ์ด๋ฏธ์ง€๋ฅผ ๊ธฐ๋ฐ˜์œผ๋กœ ์‚ฌ์šฉ
    → AS build๋กœ ์ด๋ฆ„์„ ๋ถ™์—ฌ, ๋นŒ๋“œ ์ „์šฉ ์Šคํ…Œ์ด์ง€๋กœ ์ง€์ •
  • WORKDIR /app
    → ์ปจํ…Œ์ด๋„ˆ ์•ˆ์—์„œ ์ž‘์—… ๋””๋ ‰ํ„ฐ๋ฆฌ๋ฅผ /app์œผ๋กœ ์„ค์ •
  • COPY . .
    → ํ˜„์žฌ ํ˜ธ์ŠคํŠธ์˜ ํ”„๋กœ์ ํŠธ ์†Œ์Šค ์ฝ”๋“œ๋ฅผ ์ปจํ…Œ์ด๋„ˆ /app์— ๋ณต์‚ฌ
  • RUN chmod +x gradlew
    → ๋ฆฌ๋ˆ…์Šค ํ™˜๊ฒฝ์—์„œ ์‹คํ–‰ ๊ฐ€๋Šฅํ•˜๋„๋ก Gradle Wrapper(gradlew)์— ์‹คํ–‰ ๊ถŒํ•œ์„ ๋ถ€์—ฌ
  • RUN ./gradlew clean build -x test --no-daemon
    → Gradle๋กœ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์„ ๋นŒ๋“œ
    → ํ…Œ์ŠคํŠธ ์ฝ”๋“œ๋ฅผ ์‹คํ–‰ํ•˜์ง€ ์•Š๊ณ  ๋นŒ๋“œํ•œ๋‹ค๋Š” ์˜๋ฏธ + ๋ฐ๋ชฌ ๋น„ํ™œ์„ฑํ™”
    → ๊ฒฐ๊ณผ์ ์œผ๋กœ /app/build/libs/ ๋ฐ‘์— .jar ํŒŒ์ผ์ด ์ƒ์„ฑ๋จ

 

# Run Stage
FROM eclipse-temurin:17-jre
WORKDIR /app

COPY --from=build /app/build/libs/*.jar app.jar

EXPOSE 8080
ENTRYPOINT ["java", "-jar", "app.jar"]

 

  • FROM eclipse-temurin:17-jdk
    → ์‹คํ–‰ ํ™˜๊ฒฝ๋„ OpenJDK 17์„ ๊ธฐ๋ฐ˜์œผ๋กœ ํ•จ
    → ๋นŒ๋“œ์— ํ•„์š”ํ•œ Gradle ๋“ฑ์€ ํฌํ•จํ•˜์ง€ ์•Š์•„ ์ด๋ฏธ์ง€ ํฌ๊ธฐ ์ ˆ๊ฐ ๊ฐ€๋Šฅ
  • WORKDIR /app
    → ์‹คํ–‰ ํ™˜๊ฒฝ์—์„œ๋„ /app์„ ์ž‘์—… ๋””๋ ‰ํ„ฐ๋ฆฌ๋กœ ์‚ฌ์šฉ.
  • COPY --from=build /app/build/libs/*.jar app.jar
    → ์•ž์—์„œ ๋งŒ๋“  build stage์—์„œ ๋นŒ๋“œ๋œ .jar ํŒŒ์ผ์„ ๋ณต์‚ฌ
    → ์ปจํ…Œ์ด๋„ˆ ์•ˆ์— app.jar๋ผ๋Š” ์ด๋ฆ„์œผ๋กœ ๋ฐฐ์น˜
  • EXPOSE 8080
    → ์ปจํ…Œ์ด๋„ˆ๊ฐ€ 8080 ํฌํŠธ๋ฅผ ์™ธ๋ถ€์— ๋…ธ์ถœํ•œ๋‹ค๊ณ  ์„ ์–ธ
  • ENTRYPOINT ["java", "-jar", "app.jar"]
    → ์ปจํ…Œ์ด๋„ˆ๊ฐ€ ์‹œ์ž‘๋  ๋•Œ ์‹คํ–‰ํ•  ๋ช…๋ น์–ด ์ง€์ •
    → java -jar app.jar๋กœ Spring Boot ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์ด ์‹คํ–‰๋จ

 

 

 

 

โœ”๏ธ Build Stage์™€ Run Stage๋ฅผ ๋‚˜๋ˆ„์–ด ์ตœ์ข…์ ์œผ๋กœ ์ž‘์„ฑ๋œ  Dockerfile์ด๋‹ค.

# Build Stage
FROM eclipse-temurin:17-jdk AS build
WORKDIR /app

COPY . .
RUN chmod +x gradlew
RUN ./gradlew clean build -x test --no-daemon

# Run Stage
FROM eclipse-temurin:17-jre
WORKDIR /app

COPY --from=build /app/build/libs/*.jar app.jar

EXPOSE 8080
ENTRYPOINT ["java", "-jar", "app.jar"]

<๋ฉ€ํ‹ฐ ์Šคํ…Œ์ด์ง€ ๋ฐฉ์‹์œผ๋กœ ์ž‘์„ฑํ•œ Dockerfile>

 

 

 

 

 

 

 


 

 

 

 

 

 

 

๐Ÿ’ก ๊ทธ๋™์•ˆ Dockerfile์„ ์ž‘์„ฑํ•  ๋•Œ์—๋Š” ์ด๋ฏธ์ง€๋ฅผ ๋นŒ๋“œํ•˜๊ณ  ์‹คํ–‰ํ•˜๋Š” ๋‚ด์šฉ์„ ๋‚˜๋ˆ„์ง€ ์•Š๊ณ  ๊ตฌ์„ฑํ–ˆ๋‹ค๋ฉด,

์ด๋ฒˆ์‹ค์‹œ๊ฐ„ ์ฑ„ํŒ… ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ํ”„๋กœ์ ํŠธ์—๋Š” MSAํ”„๋กœ์ ํŠธ๋ฅผ ์ง„ํ–‰ํ•˜๋ฉด์„œ ์•Œ๊ฒŒ ๋œ ๋ฉ€ํ‹ฐ ์Šคํ…Œ์ด์ง€ ๋ฐฉ์‹์„ ์ ์šฉํ•ด ๋ณด์•˜๋‹ค.

 

๋‹จ์ผ ํ”„๋กœ์ ํŠธ์ด์ง€๋งŒ ํŒ€ ํ”„๋กœ์ ํŠธ๋ฅผ ์ง„ํ–‰ํ•  ๋•Œ ์‹œ๊ฐ„ ์—ฌ์œ ๊ฐ€ ์—†์–ด์„œ ํ˜ผ์ž ์ง์ ‘ ํ•ด๋ณด์ง€ ๋ชปํ–ˆ๋˜ ๊ฒƒ๋“ค์„ ์ด๊ฒƒ์ €๊ฒƒ ์‹œ๋„ํ•ด๋ณด๋ ค๊ณ  ํ•œ๋‹ค.

์—ฌ๊ธฐ๊นŒ์ง€ ๊ฐ„๋‹จํ•œ Dockerfile์ž‘์„ฑ๋ฒ•์— ๋Œ€ํ•ด ์•Œ์•„๋ณด์•˜๋‹ค.

 

 

 

 

 

 

 

 

 

๐Ÿ“Œ  ์ฐธ๊ณ 

 

[Docker] Dockerfile์„ ์ด์šฉํ•œ Spring Boot App ํ™˜๊ฒฝ ๊ตฌ์„ฑ ๋ฐ ์‹คํ–‰๋ฐฉ๋ฒ•

ํ•ด๋‹น ๊ธ€์—์„œ๋Š” Dockerfile์„ ๊ตฌ์„ฑํ•˜์—ฌ Spring Boot App์„ ์ปจํ…Œ์ด๋„ˆ ํ™˜๊ฒฝ ๊ตฌ์„ฑ ์ดํ›„ ๋ฐฐํฌ ๋ฐฉ๋ฒ•์— ๋Œ€ํ•ด ์•Œ์•„๋ด…๋‹ˆ๋‹ค. ๐Ÿ’ก [์ฐธ๊ณ ] Docker์— ๋Œ€ํ•ด ๋” ๊ถ๊ธˆํ•˜์‹œ๋ฉด ์•„๋ž˜์˜ ๊ธ€์„ ์ฐธ๊ณ ํ•˜์‹œ๋ฉด ๋„์›€์ด ๋ฉ๋‹ˆ๋‹ค.๋ถ„๋ฅ˜์„ค

adjh54.tistory.com

 

 

[Docker] Dockerfile - Multi-stage build(๋ฉ€ํ‹ฐ์Šคํ…Œ์ด์ง€ ๋นŒ๋“œ)

์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ๊ฐœ๋ฐœ ์‹œ์— ๊ฐœ๋ฐœ ํ™˜๊ฒฝ์—์„œ ์‚ฌ์šฉํ•œ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋‚˜ ๊ฐœ๋ฐœ ์ง€์› ํˆด์ด ์ œํ’ˆ ํ™˜๊ฒฝ์—์„œ ๋ฐ˜๋“œ์‹œ ์‚ฌ์šฉ๋˜๋Š” ๊ฒƒ์€ ์•„๋‹™๋‹ˆ๋‹ค. ์ œํ’ˆ ํ™˜๊ฒฝ์—๋Š” ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์„ ์‹คํ–‰ํ•˜๊ธฐ ์œ„ํ•ด ์ตœ์†Œํ•œ์œผ๋กœ ํ•„์š”ํ•œ

kimjingo.tistory.com