Multi-stage build
도커를 빌드하는데 node를 쓸 일이 있었다. 이 node는 빌드 시점에 단 한 번만 작동하고 실제 동작하는 이미지에는 그 작동의 결과물만 하나의 작은 파일 형태로 가져오면 되는 일이었다. 문제는 이걸 그냥 node까지 통째로 실어서 빌드 해버리면 그 용량이 엄청나게 커진다. 이런 상황에서 사이즈를 경량화하기 위해 사용해주는것이 Multi-stage build라고 할 수 있겠다.
FROM node
# TODO ...
위는 Multi-stage build를 사용하지 않은 Dockerfile이다. 그냥 평범한 형태로, 이 이미지는 빌드해보면 용량이 600메가바이트가 넘게 나온다. AWS는 일반적으로 파일을 쓸 때 용량에 비례한 요금을 청구한다. 불필요한 데이터 600메가바이트가 들어있으면 그만큼 비용이 나간다. 돈 아깝다. 게다가 CI/CD 관점에서 봤을 때, 이미지의 용량이 클 경우 이미지를 받아올 때 그 용량 만큼의 시간이 소모되기 때문에 바람직하지 않은 상태가 된다. 그러면 이걸 어떻게 경량화 하느느냐, 이렇게 하면 된다.
예시는 swagger-ui를 올리고 싶은 상황인데 node를 이용해 특정한 작업을 해야한다면?!?!을 예로 들겠다.
FROM node AS build
# TODO ...
# /node-result.txt file generate
FROM swaggerapi/swagger-ui
COPY --from==build /node-result.txt /result.txt
# TODO ...
AS build를 붙여주지 않은 경우, COPY --from=0 으로도 사용 가능하다. 아마 스테이징에 선언된 순서대로 번호가 붙는 것일 것이다.
이러한 작업을 거친 뒤 빌드해보면 용량이 30MB 정도가 된 것을 알 수 있다.
이렇게 일회성으로 사용하는 패키지의 경우 multi-stage build를 해주면 경량화에 도움이 될 것이다.
'내가 배운 것들 > 기타' 카테고리의 다른 글
[MySQL] 루트 암호 단순한 4글자로 변경하기 치트시트 (0) | 2022.11.21 |
---|---|
[Mac] xcrun: error: invalid active developer path .... (0) | 2022.11.21 |
[면접] 면접 준비 질문들.. (0) | 2022.02.02 |
[nginx/Ubuntu] nginx 환경에서 https 기능 활성화 시키기 (0) | 2022.01.20 |
[Java] 문자열의 유사도 구하기 : 거리 알고리즘 (0) | 2022.01.18 |
댓글