클라우드와 컨테이너의 기초

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로 만든 최종 이미지에 포함되는 것으로 올바른 것은?

  1. Abuild 스테이지에서 만든 실행 파일 /app뿐이며, Go 컴파일러나 소스 코드는 포함되지 않는다
  2. Bbuild 스테이지와 마지막 스테이지의 레이어가 모두 겹쳐져, Go 컴파일러, 소스 코드, /app이 모두 포함된다
  3. C첫 FROM의 golang 이미지와 소스 코드뿐이며, /app은 컨테이너를 시작할 때마다 빌드된다
정답과 해설 보기

정답: A. build 스테이지에서 만든 실행 파일 /app뿐이며, Go 컴파일러나 소스 코드는 포함되지 않는다

멀티 스테이지 빌드에서는 FROM마다 스테이지가 나뉘며, 최종 이미지가 되는 것은 마지막 스테이지뿐입니다. 앞의 스테이지는 컴파일러 등을 사용해 산출물을 만들기 위한 것으로, COPY --from으로 지정한 파일만 마지막 스테이지로 들어옵니다. 여기서는 빈 scratch 위에 /app만 복사되므로, Go 컴파일러나 소스 코드를 포함하지 않는 작은 이미지가 됩니다. scratch에는 공유 라이브러리도 없으므로, CGO_ENABLED=0으로 다른 라이브러리에 의존하지 않는 실행 파일을 만들고 있습니다. 포함되는 것이 적으면 가져오기가 빨라지고, 공격에 쓰일 수 있는 도구나 취약점의 대상도 줄일 수 있습니다.

이 분야 연습하기 분야로 돌아가기

클라우드와 컨테이너의 기초의 다른 문제

  1. Kubernetes에서 배포하고 관리하는 최소 단위로, 하나 이상의 컨테이너를 묶어 같은 IP 주소와 볼륨을 공유하게 하는 것은?
  2. Kubernetes에서 replicas: 3을 지정한 Deployment의 Pod가 3개 동작하고 있다. 이 중 하나의 Pod를 kubectl delete pod로 삭제했을 때 일어나는 일로 올바른 것은?
  3. Kubernetes의 Deployment에서 Pod 템플릿의 컨테이너 이미지를 새 버전으로 변경했다. 기본 업데이트 방식(RollingUpdate)에서 일어나는 일로 올바른 것은?
  4. replicas: 10인 Deployment에서 롤링 업데이트 설정을 maxSurge: 25%, maxUnavailable: 25%로 했다. 업데이트 도중의 Pod 총수의 상한과 이용 가능한 Pod 수의 하한의 조합으로 올바른 것은?
  5. Kubernetes에서 Pod는 다시 만들어질 때마다 IP 주소가 바뀐다. 다른 애플리케이션이 라벨로 고른 여러 Pod에, 바뀌지 않는 이름과 주소로 접속하여 부하를 분산할 수 있게 하는 리소스는?