Repository navigation
Expand file tree
/
Copy pathDockerfile.render
More file actions
106 lines (92 loc) ยท 6.9 KB
/
Copy pathDockerfile.render
File metadata and controls
106 lines (92 loc) ยท 6.9 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
# syntax=docker/dockerfile:1
# =============================================================================
# Render ๋ฌด๋ฃ ๋ฐ๋ชจ ์ด๋ฏธ์ง โ ์ฌ์ฉ์ ์ฌ์ดํธ "honeyrest" (render.yaml ์ honeyrest ์๋น์ค)
# ํ๋์ ์ปจํ
์ด๋๊ฐ React SPA(์ ์ ํ์ผ)์ ์ฌ์ฉ์ API ๋ฅผ ๊ฐ์ Origin ์์ ํจ๊ป ์๋นํ๋ค.
# (์ด์ ๋ฐฐํฌ๋ deploy/ ์ Caddy + docker-compose ๊ตฌ์ฑ์ ์ด๋ค. ์ด ํ์ผ์ ๋ฐ๋ชจ ์ ์ฉ์ด๋ฉฐ ์ด์ ์ด๋ฏธ์ง์ ๋ฌด๊ดํ๋ค.)
#
# 1๋จ๊ณ(spa) : ํ๋ก ํธ์๋ ์ ์ฅ์๋ฅผ git clone(alpine/git) ํด VITE_DEMO=true ๋ก ๋น๋ (VITE_BACKEND_URL ์ ๋น์ โ ์๋ ๊ฒฝ๋ก /api)
# 2๋จ๊ณ(build) : Gradle bootJar -Pdemo (H2 ๋๋ผ์ด๋ฒ ํฌํจ)
# 3๋จ๊ณ(runtime): JRE 17 + jar(ํ์ด์ ์คํ) + SPA(dist โ /app/static) + ๋ฐ๋ชจ ์๋ ์ด๋ฏธ์ง(/app/uploads/demo, /app/uploads/placeholder)
#
# ๋ก์ปฌ ํ์ธ:
# docker build -f Dockerfile.render -t honeyrest-demo .
# docker run --rm -p 8080:8080 --memory=512m --cpus=0.1 honeyrest-demo
#
# ๋น๋ ์ธ์: Render ๋ ์๋น์ค ํ๊ฒฝ๋ณ์๋ฅผ ๊ฐ์ ์ด๋ฆ์ ๋น๋ ์ธ์๋ก๋ ๋๊ธด๋ค(render.yaml envVars โ ARG).
# FRONTEND_REF : ํ๋ก ํธ์๋ ๋ธ๋์น/ํ๊ทธ (๊ธฐ๋ณธ master)
# VITE_ADMIN_URL : ๋ฐ๋ชจ ๋ฐฐ๋์ "๊ด๋ฆฌ์ ๋ฐ๋ชจ ์ด๊ธฐ" ๋งํฌ (์: https://honeyrest-admin.onrender.com)
# ์ฃผ์: ํ๋ก ํธ์๋๋ง ๋ฐ๋๊ณ ์ด ์ ์ฅ์๊ฐ ๊ทธ๋๋ก๋ฉด Render ์ ๋ ์ด์ด ์บ์ ๋๋ฌธ์ clone ๋จ๊ณ๊ฐ ์ฌ์ฌ์ฉ๋ ์ ์๋ค.
# ๊ทธ๋ด ๋๋ Render ๋์๋ณด๋์์ "Manual Deploy โ Clear build cache & deploy" (docs/DEPLOY_RENDER.md).
# =============================================================================
# ํ๋ก ํธ์๋ ์์ค ๊ฐ์ ธ์ค๊ธฐ (git ์ด ๋ค์ด ์๋ ์์ ์ด๋ฏธ์ง โ ํจํค์ง ์ค์น ์์ด clone ๋ง ํ๋ค)
FROM alpine/git:2.49.1 AS frontend-src
ARG FRONTEND_REPO=https://github.com/Seongwonp/honeyrest_user_react
ARG FRONTEND_REF=master
RUN git clone --depth 1 --branch "${FRONTEND_REF}" "${FRONTEND_REPO}" /spa \
&& git -C /spa log -1 --format='frontend commit: %h %s' \
&& rm -rf /spa/.git
# -----------------------------------------------------------------------------
FROM node:20-alpine AS spa
WORKDIR /spa
COPY --from=frontend-src /spa/ ./
RUN npm ci --no-audit --no-fund
# ๊ธฐ๋ณธ๊ฐ์ render.yaml ์ด ์์ํ๋ ๊ด๋ฆฌ์ ์ฃผ์. Render ๊ฐ ํ๊ฒฝ๋ณ์๋ฅผ ๋น๋ ์ธ์๋ก ๋๊ธฐ๋ฉด ๊ทธ ๊ฐ์ด ์ฐ์ ํ๋ค.
ARG VITE_ADMIN_URL="https://honeyrest-admin.onrender.com"
# - ์ ์ฅ์์ .env ๊ฐ ์์ฌ ์์ด๋ ๋ฌด์ํ๋ค (๊ฐ์ ์๋ ๋น๋ ์ธ์๋ก๋ง ๋ฐ๋๋ค)
# - VITE_E2E ๋ ์ ๋ ์ผ์ง ์๋๋ค. VITE_DEMO=true ๋ก ๋ฐ๋ชจ ๋ฐฐ๋ยท๋ฐ๋ชจ ๋ก๊ทธ์ธยท"ํ
์คํธ ๊ฒฐ์ (๋ฐ๋ชจ)" ๋ฒํผ์ ์ผ ๋ค
# - ๋ฐ๋ชจ ์ฝ๋๊ฐ ์ค์ ๋ก ๋ค์ด๊ฐ๋์ง(data-testid="demo-login") ํ์ธํด, ๋ฐ๋ชจ ๊ธฐ๋ฅ์ด ์๋ ํ๋ก ํธ ์ปค๋ฐ์ด๋ฉด ๋น๋๋ฅผ ์คํจ์ํจ๋ค
RUN rm -f .env .env.local .env.production .env.production.local \
&& env -u VITE_E2E VITE_DEMO=true VITE_BACKEND_URL="" VITE_ADMIN_URL="${VITE_ADMIN_URL}" \
NODE_OPTIONS="--max-old-space-size=1536" npm run build \
&& test -f dist/index.html \
&& { grep -rq "demo-login" dist || { echo "ํ๋ก ํธ์๋์ VITE_DEMO ๊ธฐ๋ฅ์ด ์์ต๋๋ค (FRONTEND_REF ํ์ธ)" >&2; exit 1; }; }
# -----------------------------------------------------------------------------
FROM eclipse-temurin:17-jdk AS build
WORKDIR /workspace
ENV GRADLE_OPTS="-Xmx512m -Dorg.gradle.daemon=false -Dorg.gradle.jvmargs=-Xmx1g -Dorg.gradle.workers.max=2 -Dorg.gradle.welcome=never"
# ์์กด์ฑ ํด์์ ํ์ํ ๋น๋ ์คํฌ๋ฆฝํธ๋ง ๋จผ์ ๋ณต์ฌ โ ์์ค๋ง ๋ฐ๋๋ฉด Gradle ๋ฐฐํฌํ/์์กด์ฑ ๋ ์ด์ด๋ฅผ ์ฌ์ฌ์ฉ
COPY gradlew settings.gradle build.gradle ./
COPY gradle gradle
COPY honeyrest-domain/build.gradle honeyrest-domain/build.gradle
RUN chmod +x gradlew && sed -i 's/\r$//' gradlew \
&& ./gradlew --no-daemon -Pdemo dependencies --configuration runtimeClasspath > /dev/null
COPY honeyrest-domain honeyrest-domain
COPY src src
# -Pdemo: H2 ๋๋ผ์ด๋ฒ๋ฅผ ์คํ jar ์ ํฌํจ (build.gradle). ํ
์คํธ๋ CI ์์ ์คํํ๋ฏ๋ก ์๋ต.
# jarmode=tools extract: ์ค์ฒฉ jar ๋์ ํ์ด ๋ ํด๋์คํจ์ค๋ก ์คํ โ 0.1 CPU ์์ ๊ธฐ๋์ด ์กฐ๊ธ ๋น ๋ฅด๋ค.
RUN ./gradlew --no-daemon -Pdemo bootJar -x test \
&& find build/libs -name '*.jar' ! -name '*-plain.jar' -exec cp {} /workspace/app.jar \; \
&& test -s /workspace/app.jar \
&& java -Djarmode=tools -jar /workspace/app.jar extract --destination /workspace/extracted
# -----------------------------------------------------------------------------
FROM eclipse-temurin:17-jre AS runtime
ARG APP_UID=10001
RUN groupadd --system --gid ${APP_UID} honeyrest \
&& useradd --system --uid ${APP_UID} --gid honeyrest --home-dir /app --shell /usr/sbin/nologin honeyrest \
&& mkdir -p /app/uploads /app/static \
&& chown -R honeyrest:honeyrest /app
WORKDIR /app
COPY --from=build --chown=honeyrest:honeyrest /workspace/extracted/ /app/
COPY --from=spa --chown=honeyrest:honeyrest /spa/dist/ /app/static/
COPY --chown=honeyrest:honeyrest uploads/placeholder /app/uploads/placeholder
# db/demo-seed.sql ์ ์์ยท๊ฐ์คยท๋ฐฐ๋ยท์ด๋ฒคํธยท์ง์ญ ์ด๋ฏธ์ง (์ฌ์ง + ๊ธ์ ์๋ ์ผ๋ฌ์คํธ)
COPY --chown=honeyrest:honeyrest uploads/demo /app/uploads/demo
# JAVA_TOOL_OPTIONS: 512MB / 0.1 CPU ์ฉ JVM ์ต์
(render.yaml ์์ ๋ฎ์ด์ธ ์ ์๋ค, docs/DEPLOY_RENDER.md ์ฐธ๊ณ )
# ์ค์ธก(--memory=512m --cpus=0.1): ํ ์ฌ์ฉ ~70MB, ๋ฉํ์คํ์ด์ค ~105MB, ์ปจํ
์ด๋ ๋ฉ๋ชจ๋ฆฌ ~240~270MB
# โ ํ ์ํ์ 50%(256MB)๋ฉด ์ถฉ๋ถํ๊ณ , ๋๋จธ์ง๋ฅผ ๋ฉํ์คํ์ด์คยทCDSยท์ค๋ ๋ ์คํ์ ๋จ๊ธด๋ค.
ENV TZ=Asia/Seoul \
SPRING_PROFILES_ACTIVE=demo \
APP_STATIC_DIR=/app/static \
APP_STORAGE_LOCAL_DIR=/app/uploads \
JAVA_TOOL_OPTIONS="-XX:MaxRAMPercentage=50 -XX:+UseSerialGC -Xss512k -XX:MaxMetaspaceSize=160m -XX:TieredStopAtLevel=1 -XX:+ExitOnOutOfMemoryError"
# CDS(ํด๋์ค ๋ฐ์ดํฐ ๊ณต์ ) ์์นด์ด๋ธ: ๋น๋ ์ค์ ํ ๋ฒ ์ปจํ
์คํธ๋ฅผ ๋์ ๋ค๊ฐ(onRefresh ์์ ์ข
๋ฃ) ๋ก๋ฉํ ํด๋์ค๋ฅผ ์ ์ฅํด ๋๋ฉด
# ์ค์ ๊ธฐ๋ ๋ ํด๋์ค ๋ก๋ฉ/๊ฒ์ฆ ์๊ฐ์ด ํฌ๊ฒ ์ค์ด๋ ๋ค (0.1 CPU ์์ ์ฒด๊ฐ์ด ํผ). H2 ์ธ๋ฉ๋ชจ๋ฆฌ๋ผ ์ธ๋ถ ์ฐ๊ฒฐ ์์ด ๋๋๋ค.
# ์์นด์ด๋ธ๊ฐ ์๊ฑฐ๋ JVM ์ด ๋ง์ง ์์ผ๋ฉด JVM ์ด ๋ฌด์ํ๊ณ ํ์์ฒ๋ผ ๊ธฐ๋ํ๋ฏ๋ก, ์คํจํด๋ ์ด๋ฏธ์ง ๋น๋๋ ๊ณ์ํ๋ค.
RUN java -XX:ArchiveClassesAtExit=/app/app.jsa -Dspring.context.exit=onRefresh -jar /app/app.jar > /tmp/cds-training.log 2>&1 \
; if [ -s /app/app.jsa ]; then chown honeyrest:honeyrest /app/app.jsa && echo "CDS archive: $(du -h /app/app.jsa | cut -f1)"; \
else echo "CDS ์์นด์ด๋ธ ์์ฑ ์คํจ (๊ธฐ๋์ ๊ฐ๋ฅ, ๋๋ฆด ๋ฟ)" >&2; tail -20 /tmp/cds-training.log >&2; fi \
; rm -f /tmp/cds-training.log
USER honeyrest
EXPOSE 8080
# Render ๋ PORT ๋ฅผ ๋๊ฒจ ์ค๋ค (application-demo.properties: server.port=${PORT:8080})
ENTRYPOINT ["java", "-XX:SharedArchiveFile=/app/app.jsa", "-Xlog:cds=off", "-Xlog:cds+dynamic=off", "-jar", "/app/app.jar"]