Files
document-haness/docs/TechLog/tech-log-studio/only-visible-after-deploying/case/case-a-build-argument-left-out.md
T
DongHyeonkaandClaude Opus 5 6feee5ba57 docs(TechLog): 자료에 남아 있던 사람의 흔적을 제자리에 놓는다
writing-as-the-person-who-did-it 을 서브에이전트 셋으로 나눠 56편에 적용했다.
56편 중 20편만 고쳤다 — 나머지 36편은 SSOT 를 절 단위로 대조했을 때 옮길 흔적이
이미 옮겨져 있었거나 없었다. 없는 목소리를 채우지 않는다.

옮긴 것은 전부 SSOT 의 어느 절에서 왔는지 댈 수 있다.

  §3.4  「눈으로 찾을 일이 아니었다」— 세 계약을 파싱해 뽑은 이유
  §4.3  구현하지 않기로 한 것과 빠뜨린 것은 다르다
  §8.5  표의 마지막 줄을 더할 때 이 목록을 또 빠뜨렸다
  §9.4  「왜 주제 링크가 탐색으로 가지?」— 우회를 남겨 두면 계속 나온 질문
  §11.3 「세 버튼」을 실제 이름으로 되돌리고 두 언어가 섞인 것을 그 자리에
  §12.2 막지 않은 대신 메모리에 남긴 것
  §13.1 여섯 벌 인용이 어느 커밋이 짚은 말인지
  §13.3 고쳐 쓴 첫 안이 거절당한 것과 사용자가 고른 말 두 쌍
  §14.3 「문서가 그대로 나온다」는 구조 차이가 아니라 내용 양의 차이라는 정정
  §16.1 삭제가 막힌 실제 기록 이름과 그것을 막은 프로젝트 링크
  §16.9 주제 논지와 축 결론이 AI 가 써서 DB 에 직접 넣은 미검토 초안이라는 것
  §17.5 바운딩 박스로 잘못 지목한 대상이 「판단 기준」이었다는 것

검증 환경의 커밋 해시 하나가 틀려 있었다(ca1cfa2 → ca1fc92). SSOT §13.1 과
부록 A 가 적은 값이고 저장소에 그 커밋이 있다.

검사 넷 전부 통과한다 — check_prose 56편 error 0 · check_body PASS ·
check_evidence --repo 문제 없음 · verify-tech-log-tree 프로젝트 5 error 0 warn 0.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2026-09-07 16:31:48 +09:00

3.2 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 주소를 빌드 인자로 받는다. 런타임 환경 변수가 아니므로 배포한 뒤에는 바꿀 수 없고, 잘못 넣으면 다시 빌드해서 다시 올려야 한다.

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

요구하는 인자 전부

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 로 이전 리비전으로 되돌린 뒤 인자를 넣어 다시 빌드하고 다시 올렸다.

확인하지 못한 것

빌드가 이 인자를 요구하도록 막지 않았다. 빠뜨리면 여전히 빌드는 성공하고 배포본만 틀린다. 인자 목록을 적어 두고 메모리에 한 건 남긴 것으로 그쳤다 — techlog-deploy-runtime-api-base.md.