클라우드와 컨테이너의 기초
FROM golang AS build
WORKDIR /src
COPY . .
RUN CGO_ENABLED=0 go build -o /out/app .
FROM scratch
COPY --from=build /out/app /app
ENTRYPOINT ["/app"]scratch는 파일을 하나도 포함하지 않는 빈 이미지이다. 위의 멀티 스테이지 빌드 Dockerfile로 만든 최종 이미지에 포함되는 것으로 올바른 것은?
- Abuild 스테이지에서 만든 실행 파일 /app뿐이며, Go 컴파일러나 소스 코드는 포함되지 않는다
- Bbuild 스테이지와 마지막 스테이지의 레이어가 모두 겹쳐져, Go 컴파일러, 소스 코드, /app이 모두 포함된다
- C첫 FROM의 golang 이미지와 소스 코드뿐이며, /app은 컨테이너를 시작할 때마다 빌드된다
정답과 해설 보기
정답: A. build 스테이지에서 만든 실행 파일 /app뿐이며, Go 컴파일러나 소스 코드는 포함되지 않는다
멀티 스테이지 빌드에서는 FROM마다 스테이지가 나뉘며, 최종 이미지가 되는 것은 마지막 스테이지뿐입니다. 앞의 스테이지는 컴파일러 등을 사용해 산출물을 만들기 위한 것으로, COPY --from으로 지정한 파일만 마지막 스테이지로 들어옵니다. 여기서는 빈 scratch 위에 /app만 복사되므로, Go 컴파일러나 소스 코드를 포함하지 않는 작은 이미지가 됩니다. scratch에는 공유 라이브러리도 없으므로, CGO_ENABLED=0으로 다른 라이브러리에 의존하지 않는 실행 파일을 만들고 있습니다. 포함되는 것이 적으면 가져오기가 빨라지고, 공격에 쓰일 수 있는 도구나 취약점의 대상도 줄일 수 있습니다.