Files
document-haness/docs/TechLog/tech-log-studio/only-visible-after-deploying/case/case-a-build-argument-left-out.md
T
DongHyeonkaandClaude Opus 5 b1653dbba8 docs(TechLog): 주제 7~10 을 다시 쓴다
주소가 게시 시점에 굳어 저장되는 구조, 축 링크를 두 번 옮긴 순서, 한글 slug 가
간헐적으로 보인 두 가지 어긋남을 표로 갈랐다. 화면이 실패를 없음으로 그릴 때 작성
도구에서 왜 더 오래 숨는지, Promise.all 이 거절과 던짐에서 다른 경로를 타는 이유를
채웠다. CSS module 이 왜 전역 규칙에 닿지 않는지, 403 과 404 가 원인을 어떻게
좁혔는지도 적었다.

link-audit.py 를 감사 Case 의 evidence 로 걸어 배정한 증거 하나를 메웠다.

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

3.7 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

되돌리고 다시 빌드했다

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

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

확인하지 못한 것

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