Repository navigation
Expand file tree
/
Copy pathDockerfile
More file actions
60 lines (51 loc) · 3.46 KB
/
Copy pathDockerfile
File metadata and controls
60 lines (51 loc) · 3.46 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
FROM eclipse-temurin:17-jdk AS builder
WORKDIR /app
# Gradle wrapper 복사
COPY gradlew .
COPY gradle gradle
RUN chmod +x gradlew
# 의존성 캐싱을 위해 build 파일 먼저 복사
COPY build.gradle settings.gradle ./
COPY config config
RUN ./gradlew dependencies --no-daemon || true
# 소스 복사 및 빌드.
#
# `.git` 은 복사하지 않는다 (#422). #413 이 git.properties(/actuator/info 의 git sha — deploy-history.yml 이
# «정말 이 커밋이 떠 있는가»를 확인하는 값, ssccops#340)를 위해 `COPY .git .git` 을 넣었는데 **Coolify 의
# 빌드 컨텍스트에는 `.git` 이 없어** 그 줄에서 빌드가 죽었고 dev 배포가 5건 연속 실패했다(COPY 는
# 없는 경로를 건너뛰지 못한다). 대신 SOURCE_COMMIT 을 ARG 로 받아 RUN 의 환경으로 넘기면
# build.gradle(generateGitProperties)이 그 값으로 git.commit.id 를 쓴다.
#
# **그 인자는 GitHub Actions 가 넣는다 — dev 와 prod 가 같다** (#569 · ssccops#513 → #581 · ssccops#519):
# `.github/workflows/deploy-dev.yml` · `deploy-prod.yml` 의 build-args(`SOURCE_COMMIT=<그 실행의 커밋>`).
# 이미지를 Actions 가 빌드해 GHCR 에 올리고 Coolify 는 받아 띄우기만 한다.
#
# 예외는 **prod 전환 전의 옛 경로**다 — `COOLIFY_PROD_DEPLOY_WEBHOOK` 이 비어 있는 동안은 Coolify 가
# 호스트에서 이 Dockerfile 로 빌드하며 빌드 인자를 넣는다. 그 인자는 앱 설정 «Source commit
# availability = Available during build» 일 때만 온다(#424 · 기본값 `Runtime only` 는 커밋마다 값이
# 바뀌어 캐시를 깨므로 빌드에서 뺀 것). **Coolify git 빌드 리소스를 새로 만들면 이 토글부터** —
# 꺼져 있으면 빌드는 성공하는데 /actuator/info 에 git 이 없다. 이미지 리소스에는 해당하지 않는다.
#
# 로컬 `docker compose` 처럼 그 인자가 아예 없으면 git 정보 없이 뜨고 레코드는 unverified 가 된다
# (부팅은 막지 않는다). git.branch · git.commit.time 은 이 경로에서 나오지 않는다 — sha 하나면
# 확인에는 충분하다.
COPY src src
ARG SOURCE_COMMIT
RUN ./gradlew bootJar -x checkstyleMain -x checkstyleTest -x spotlessCheck --no-daemon
FROM eclipse-temurin:17-jre
WORKDIR /app
# 이름이 고정돼 있다 — build.gradle 의 bootJar.archiveFileName 이 'app.jar' 로 못 박는다.
# 예전에는 `*-SNAPSHOT.jar` 글롭이었는데, 그러면 버전에서 -SNAPSHOT 을 떼는 순간 맞는 파일이
# 없어 이 줄에서 빌드가 죽는다. 버전은 /actuator/info 와 git 태그가 말하므로 파일명이 그것을
# 또 말할 이유가 없다.
COPY --from=builder /app/build/libs/app.jar app.jar
EXPOSE 8080
# JVM 메모리 플래그를 두지 않는다 — 기본값에 맡긴다 (#202).
# 예전에는 -XX:MaxRAMPercentage=60.0 -XX:+UseSerialGC -Xss512k 를 명시했는데(#107),
# Render 무료 티어(512MB)에서 부팅 중 Hibernate가 EntityManagerFactory를 만들다
# OOM으로 죽던 것(exit 137)을 막기 위해서였다. 배포가 Coolify(13.6GB)로 옮겨오며 그
# 제약이 사라졌다 — 기본값(힙 25%)이면 힙만으로도 죽던 시절의 수십 배다. SerialGC는
# 오히려 큰 힙에서 G1GC보다 GC 정지가 길어 손해이고, 좁힌 스택(512k)은 깊은 재귀에서
# StackOverflowError 위험만 남긴다.
# 나중에 컨테이너 메모리를 좁게 제한하게 되면 이 결정을 다시 볼 것.
ENTRYPOINT ["java", "-jar", "app.jar"]