Files
document-haness/docs/TechLog/tech-log-studio/only-visible-after-deploying/case/case-a-build-argument-left-out.md
T
DongHyeonkaandClaude Opus 5 fd221353a3 docs(TechLog): 얇은 Case 열 편과 Question 셋을 저장소 실물로 채운다
SSOT 를 저장소에서 확인해 더 보강하고 그것으로 다시 썼다.

  §7.2   참조 검사 SQL 을 문자열로 조립하는 실제 코드 — 컴파일러가 표 이름도
         컬럼 이름도 보지 않는다는 것이 그 모양에서 드러난다
  §11.2  section-heading-rank 가 미디어 쿼리 값을 먼저 걷어내는 이유(테스트 주석)
  §16.1  질문 삭제는 참조가 둘뿐이라 같은 문제가 덜하다는 대조

Case 열 편과 Question 셋을 다시 썼다. Question 은 사실·가정·미지수·제약을 갈라
채우고 선택지마다 무엇을 감수하는지 적었다 — 오류 코드를 나누면 계약과 반입한 두
저장소가 함께 움직인다는 것처럼.

SSOT 62,643 → 68,319 자. 검사 넷 전부 통과한다.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2026-09-07 19:18:37 +09:00

4.4 KiB

kind, slug, title, topic, topicName, project, status, lastVerifiedOn, sourceRevision, source
kind slug title topic topicName project status lastVerifiedOn sourceRevision source
CASE a-build-argument-left-out 배포 인자를 빠뜨려 배포본이 존재하지 않는 주소를 불렀다 only-visible-after-deploying 배포해 봐야 드러난 것 TechLog 게시 전 2026-09-04 tech-log@2026-09-02
final/document.md#§12.2

배포 인자를 빠뜨려 배포본이 존재하지 않는 주소를 불렀다

프론트 이미지를 빌드하면서 API 주소 인자를 넘기지 않았다. 배포본이 존재하지 않는 주소를 불렀다. Dockerfile 이 그 경고를 문자 그대로 적어 두고 있었다.

관계

  • 레지스트리 없이 tar 를 import 하는 배포 경로 왜 이 인자가 이미지에 굳는지가 그 개념에 있다.
  • 배포 전에 사람이 돌려야 하는 것과 그 함정 이 사건 뒤에 목록으로 굳혔다.
  • 컨테이너는 healthy 였고 SPA 가 부팅에 필요한 파일 하나만 403 이었다 같은 배포에서 드러난 다른 사건이다.

문제

배포본이 API 를 부르는데 존재하지 않는 주소로 나갔다. 화면은 데이터를 받지 못했다.

빌드는 성공했고 이미지도 정상적으로 올라왔다.

결론

프론트 이미지 빌드에 RUNTIME_API_BASE_URL 을 넘기지 않으면 기본값이 이미지에 굳는다. 그 기본값이 존재하지 않는 주소다.

Dockerfile 이 그 경고를 문자 그대로 적어 두고 있는데도 빠뜨렸다.

kubectl rollout undo 로 되돌리고 다시 빌드했다.

검증 환경

프론트 이미지 : APP_PROFILE · VITE_ROUTER_BASE_PATH · RUNTIME_API_BASE_URL · VITE_BUILD_ID · VITE_COMMIT_SHA · RELEASE_ID · CI_RUNNER_IMAGE · SOURCE_DATE_EPOCH 런타임 : k3s 확인 방식 : 배포본의 네트워크 요청에서 실제로 나가는 주소 확인

재현 조건

  1. 프론트 이미지를 API 주소 인자 없이 빌드한다
  2. 배포하고 사이트를 연다
  3. 개발자도구 네트워크에서 API 요청이 어느 호스트로 나가는지 본다

본문

빌드 인자는 이미지에 굳는다

이 프론트는 API 주소를 빌드 인자로 받는다. 번들러가 빌드할 때 그 값을 코드에 박아 넣으므로 런타임 환경 변수가 아니고, 배포한 뒤에는 바꿀 수 없다.

인자를 넘기지 않으면 기본값이 들어간다. 그 기본값은 존재하지 않는 주소다.

빌드도 배포도 성공한다

빌드는 인자가 없어도 성공한다. 이미지도 정상적으로 올라오고 파드도 healthy 다.

드러나는 곳은 배포본이 첫 요청을 낼 때다. 브라우저가 존재하지 않는 호스트로 요청을 보내고, 화면은 데이터를 받지 못한다.

Dockerfile 이 그 경고를 문자 그대로 적어 두고 있었는데도 빠뜨렸다.

APP_PROFILE=production
VITE_ROUTER_BASE_PATH=/
RUNTIME_API_BASE_URL=https://hyeonworks.com/     ← 빠뜨리면 api.example.com
VITE_BUILD_ID / VITE_COMMIT_SHA / RELEASE_ID
CI_RUNNER_IMAGE=node@sha256:…                    ← 반드시 @sha256 다이제스트
SOURCE_DATE_EPOCH

인자마다 빠뜨렸을 때가 다르다

여섯 줄이 같은 무게는 아니다.

빠뜨리면 언제 드러나나
API 주소 배포본이 첫 요청을 낼 때
러너 이미지 다이제스트 빌드가 재현되지 않는다 — 나중에 같은 커밋이 다른 결과를 낸다
빌드 식별자·커밋 SHA 배포된 것이 어느 커밋인지 화면에서 못 읽는다

API 주소만 화면이 바로 깨지고 나머지는 조용하다. 그래서 이 목록에서 가장 눈에 띄는 것을 빠뜨렸다는 것이 오히려 이상한데, 인자가 여섯이고 그중 하나만 값의 모양이 URL 이라 붙여넣기에서 빠졌다.

되돌리고 다시 빌드했다

kubectl rollout undo 로 이전 리비전으로 되돌린 뒤 인자를 넣어 다시 빌드하고 다시 올렸다.

되돌리는 것이 빨랐던 이유는 이전 이미지가 클러스터에 아직 있어서다. 레지스트리가 없어도 롤아웃 이력은 남으므로, 이미지를 다시 import 하지 않고 태그만 되돌리면 된다.

확인하지 못한 것

빌드가 이 인자를 요구하도록 막지 않았다. 빠뜨리면 여전히 빌드는 성공하고 배포본만 틀린다. 지금 남은 것은 인자 목록을 적어 둔 것과 메모리 하나다.