8장 container image를 작은 실행 계약으로 만든다
examples/app/Dockerfile은 Node 24 기반, non-root user, 고정 port라는 최소 계약을 표현한다.
docker build -t flownote:book examples/app
docker run --rm -p 18080:8080
-e APP_VERSION=book-local
-e GIT_SHA=$(git rev-parse --short HEAD 2>/dev/null || echo local)
flownote:book
다른 terminal에서 확인한다.
curl --fail http://127.0.0.1:18080/health/ready
docker image inspect flownote:book --format '{{json .Config.User}}'
image에 .env, AWS credential, private key를 COPY하지 않는다. build secret이 필요하면 BuildKit secret mount를 쓰고 layer에 남지 않는지 검사한다. base image tag는 학습 예제에서 읽기 쉬운 major tag를 사용했지만 release pipeline에서는 검토한 digest로 pin하고 자동 update PR로 교체한다.
multi-stage build는 compiler와 runtime을 나누는 데 유용하지만 무조건 작은 image를 보장하지 않는다. 최종 stage에 필요한 artifact만 복사하고 SBOM과 provenance를 함께 생성한다.