Container화 하는 경우 경량화를 하기 위하여 multi-stage build 를 사용하여 필요한 녀석만 알파인 또는 스크레치에 옮기는 작업을 아마 다들 할것이다. 자바의 경우는 특히 jlink나 jdept를 사용하여 필요한 라이브러리만 묶은 custome jre를 만들어서 경량화 할 수 있다.
https://aws.amazon.com/ko/blogs/tech/amazon-corretto-base-container-diet/
근데 이제 Multi-stage build는 일반적이라 layer별 모니터링하고 인사이트를 얻을 수 있는 툴을 소개해 보고자 한다.
dive cli
https://github.com/wagoodman/dive
위 툴은 사용하면 각 레이어 별로 어떤 파일이 변경되었고 수정되었고 추가되었는지 확인이 가능하다. 특히 컨테이너 빌드후 패키지가 정상적으로 들어갔는지 파악하는데 매우 유용하다.
설치는 저 위 github README 처럼 간단하게 brew로 진행하면 된다.
brew install dive
그러면 간단한 dockerfile을 하나 만들어서 테스트 해보겠다. dive에 대한 소개이니 뭐 용량 줄이는 테크닉보다는 그냥 툴 사용 방법 정도만 정리해보자
No Multi-stage
FROM python:3.11-alpine AS builder
WORKDIR /app
RUN python -m venv /opt/venv
ENV PATH="/opt/venv/bin:$PATH"
COPY . .
RUN pip install --no-cache-dir -r requirements.txt
CMD ["uvicorn", "app:app", "--host", "0.0.0.0", "--port", "8000"]
빌드 결과
docker build -t sample-langserve -f ./Dockerfile_single .
[+] Building 63.0s (11/11) FINISHED docker:orbstack
=> [internal] load build definition from Dockerfile_single 0.1s
=> => transferring dockerfile: 375B 0.0s
=> [internal] load metadata for docker.io/library/python:3.11-alpine 2.2s
=> [auth] library/python:pull token for registry-1.docker.io 0.0s
=> [internal] load .dockerignore 0.0s
=> => transferring context: 3.16kB 0.0s
=> [1/5] FROM docker.io/library/python:3.11-alpine@sha256:700b4aa84090748aafb348fc042b5970abb0a73c8f1b4fcfe0f4e3c2a4a9fcca 0.0s
=> [internal] load build context 0.1s
=> => transferring context: 9.23kB 0.0s
=> CACHED [2/5] WORKDIR /app 0.0s
=> CACHED [3/5] RUN python -m venv /opt/venv 0.0s
=> [4/5] COPY . . 0.2s
=> [5/5] RUN pip install --no-cache-dir -r requirements.txt 55.8s
=> exporting to image 4.5s
=> => exporting layers 4.5s
=> => writing image sha256:4479381f19f6892c6899b6a854aecf5fe20e7216d91fa69e976ccbfaea6a1ee1 0.0s
=> => naming to docker.io/library/sample-langserve 0.0s
image 확인
docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
sample-langserve latest 4479381f19f6 40 seconds ago 660MB
dive cli 사용
dive sample-langserve
뭔가 엄청 들어갔다. 각 layer 별로 다 나온다...사용법 자체도 별거 없다. dive 하고 container의 image id 또는 name을 입력하면 끝이다.
해당 내용을 보면
Dockerfile에 작성하지 않은 이상한 CLI들이 있다. 이건 뭘까 싶은데 요놈들은 python alpine continer에 등록된 녀석들이다.
이렇든 dive를 사용하면 현재 사용중인 base image의 layer 부터 모두 확인 가능하니 컨테이너라이징에 잘 활용해 보도록하자!
'Server Infra > Kubernetes' 카테고리의 다른 글
Pause Container를 분석해보자. (1) | 2024.09.05 |
---|---|
Container Process 를 잘 종료시켜 보자 (0) | 2024.08.31 |
PKOS 2기 4주차 - Argo Rollout(feat. Prometheus) (0) | 2023.04.02 |
PKOS 2기 3주차 - Argo Rollout(feat. EKS) (0) | 2023.03.19 |
PKOS 2기 2주차 - k8s network(feat. EKS) (0) | 2023.03.12 |