๐ ๋ชฉ์ฐจ
์ง๋ ํฌ์คํ ์์ GitHub Actions๋ฅผ ํ์ฉํด CI/CD ํ์ดํ๋ผ์ธ์ ๊ตฌ์ถํด ๋ณด์๋ค.
์ด๋ฒ ํฌ์คํ ์์๋ 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์ ์์ฑํ๋ค๋ฉด, ์ด๋ค ๋ฐฉ์์ผ๋ก ์์ฑํ ์ง ๊ตฌ์ฑํ ๋ค์ ์์ฑํด ๋ณด๋๋ก ํ์.
๊ธฐ์กด์ ์งํํ๋ ์ฌ๋ฌ ํ๋ก์ ํธ์์๋ ์ด๋ฏธ์ง ๋น๋ ๋จ๊ณ์ ์คํ ๋จ๊ณ๋ฅผ ๋ฐ๋ก ๋๋์ง ์๊ณ ์์ฑํ์๋๋ฐ, ์ด๋ฒ ํ๋ก์ ํธ์์๋ '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์ ์์ฑํ ๋์๋ ์ด๋ฏธ์ง๋ฅผ ๋น๋ํ๊ณ ์คํํ๋ ๋ด์ฉ์ ๋๋์ง ์๊ณ ๊ตฌ์ฑํ๋ค๋ฉด,
์ด๋ฒ์ค์๊ฐ ์ฑํ ์ ํ๋ฆฌ์ผ์ด์ ํ๋ก์ ํธ์๋ MSAํ๋ก์ ํธ๋ฅผ ์งํํ๋ฉด์ ์๊ฒ ๋ ๋ฉํฐ ์คํ ์ด์ง ๋ฐฉ์์ ์ ์ฉํด ๋ณด์๋ค.
๋จ์ผ ํ๋ก์ ํธ์ด์ง๋ง ํ ํ๋ก์ ํธ๋ฅผ ์งํํ ๋ ์๊ฐ ์ฌ์ ๊ฐ ์์ด์ ํผ์ ์ง์ ํด๋ณด์ง ๋ชปํ๋ ๊ฒ๋ค์ ์ด๊ฒ์ ๊ฒ ์๋ํด๋ณด๋ ค๊ณ ํ๋ค.
์ฌ๊ธฐ๊น์ง ๊ฐ๋จํ Dockerfile์์ฑ๋ฒ์ ๋ํด ์์๋ณด์๋ค.
๐ ์ฐธ๊ณ
[Docker] Dockerfile์ ์ด์ฉํ Spring Boot App ํ๊ฒฝ ๊ตฌ์ฑ ๋ฐ ์คํ๋ฐฉ๋ฒ
ํด๋น ๊ธ์์๋ Dockerfile์ ๊ตฌ์ฑํ์ฌ Spring Boot App์ ์ปจํ ์ด๋ ํ๊ฒฝ ๊ตฌ์ฑ ์ดํ ๋ฐฐํฌ ๋ฐฉ๋ฒ์ ๋ํด ์์๋ด ๋๋ค. ๐ก [์ฐธ๊ณ ] Docker์ ๋ํด ๋ ๊ถ๊ธํ์๋ฉด ์๋์ ๊ธ์ ์ฐธ๊ณ ํ์๋ฉด ๋์์ด ๋ฉ๋๋ค.๋ถ๋ฅ์ค
adjh54.tistory.com
[Docker] Dockerfile - Multi-stage build(๋ฉํฐ์คํ ์ด์ง ๋น๋)
์ ํ๋ฆฌ์ผ์ด์ ๊ฐ๋ฐ ์์ ๊ฐ๋ฐ ํ๊ฒฝ์์ ์ฌ์ฉํ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ ๊ฐ๋ฐ ์ง์ ํด์ด ์ ํ ํ๊ฒฝ์์ ๋ฐ๋์ ์ฌ์ฉ๋๋ ๊ฒ์ ์๋๋๋ค. ์ ํ ํ๊ฒฝ์๋ ์ ํ๋ฆฌ์ผ์ด์ ์ ์คํํ๊ธฐ ์ํด ์ต์ํ์ผ๋ก ํ์ํ
kimjingo.tistory.com