본문 바로가기
Back Side/etc

눈물겨운도커 이미지 사이즈 줄이기 🥹 #1 Azure CLI 사용하기

by developerBeluga 2023. 5. 9.
728x90
반응형

 

 

쉬울 줄 알았지..

 

자동으로 AKS 생성 어떻게 하는건데

자동으로 AKS가 생성되는 서비스를 만들어야 했다. 

기존엔 터미널에서 Azure 명령어를 사용하면 인제는 자동으로 명령어가 수행하게 만들어야 했다. 

어떻게 해야할까 🤔

 

간단하게 Azure 명령어를 코드에 넣고 실행하도록 하면 되겠다는 생각을 했다.

그렇기 위해서는 외부 명령어를 실행해주는 shelljs 라이브러리를 사용하면 된다.

 

 

shelljs 이용하기

이 라이브러리를 사용하기 매우 간단하다.

터미널에 작성했던 Azure 명령어를 작성하고 shelle.exec에 command를 넣으면 된다.

 

  /**
   * az aks create next
   */
  createAKSCommand(name: string) {
    console.log('create AKS Start!');
    
    const command = `az aks create -g {리소스 그룹} -n ${name} --node-count 1 --generate-ssh-keys --attach-acr {AKS 이름} --enable-cluster-autoscaler --min-count 1 --max-count 3`;
    const result = shell.exec(command);
    
    return result;
  },

아주 간단하다.

자습서에서 제공하는 명령어 그대로 사용하면 된다.

이렇게 az aks create, stop, update 등 다양한 명령어를 원하는대로 사용할 수 있다.

 

하지만 문제가 있다.

로컬에는 잘 진행되는데 도커 환경에서는 돌아가지 않는다.

 

 

도커에서 돌아가게 Azure 환경 구축해주기

우선 도커에서 Azure가 안돌아가는 이유는 환경이 구축되어져 있지 않기 때문이다.

Azure CLI이 설치를 해줘야 도커에서도 명령어를 이용할 수 있다.

 

 

기존 도커 이미지

FROM node:16-alpine 

WORKDIR /app

COPY . .

RUN yarn install

EXPOSE 3004

CMD yarn run start

우선 바뀌전 도커 이미지 코드부터 보고 가자.

보다시피 매우 yarn을 쓴다는거 빼고는 베이직한 코드이다.

 

기존 코드에서 Azure CLI와 kubectl을 설치해주는 코드를 추가해줬더니 오류가 발생했다.

오류는 node:alpine 베이스 이미지는 최소한의 패키지만 제공한다.

문제는 아래와 같이 Azure CLI 설치를 실행하는 코드에서 apt-get을 사용한다는 것이다. 

 

apt-get 패키지 매니저도 포함하고 있지 않아 apk 패키지 매니저를 사용하면 되지만 내가 고칠 수 없다.

왜냐하면 제공하는 쪽에서 저렇게 박아 넣지 않았는가?

그래서 우회하는 방법으로 node:alpine 베이스를 버리기로 결정했다.

 

반응형

 

1차 도커 이미지 수정 - 1.64GB

FROM node:16

RUN apt-get update && apt-get install -y curl bash

RUN curl -LO "https://dl.k8s.io/release/$(curl -L -s https://dl.k8s.io/release/stable.txt)/bin/linux/amd64/kubectl" && \
    install -o root -g root -m 0755 kubectl /usr/local/bin/kubectl

RUN curl -sL https://aka.ms/InstallAzureCLIDeb | bash

RUN az login 

WORKDIR /app

COPY . .

RUN yarn install

EXPOSE 3004

CMD yarn run start

 

필요한 패키지와 라이브러리를 설치했다.

그 결과 도커에서도 Azure CLI을 사용할 수 있게 되었다.

 

하지만 문제가 발생했다.

보다시피 이미지가 너무 무거워졌다.

본래 300MB였는데 무려 5배나 커진 1.64GB가 되었다 😱

 

이미지 크키가 이렇게 증가할 경우 다운로드 및 전송 시간이 길어진다.

또한 더 많은 디스크 공간이 필요하고 그에 따른 관리 비용이 증가한다.

그렇기 때문에 눈물겨운 도커 이미지 줄이기를 시작했다.

 

 

 

반응형

 

 

2차 도커 이미지 수정 - 1.48GB

FROM node:16-alpine

RUN apk add --no-cache curl bash ca-certificates gnupg openssl python3 py3-pip

RUN curl -LO "https://dl.k8s.io/release/$(curl -L -s https://dl.k8s.io/release/stable.txt)/bin/linux/amd64/kubectl" && \
    install -o root -g root -m 0755 kubectl /usr/local/bin/kubectl

# Install az CLI
RUN apk add --no-cache python3-dev libffi-dev openssl-dev gcc libc-dev make && \
    apk add --no-cache --virtual .build-deps build-base && \
    pip3 install --upgrade pip && \
    pip3 install azure-cli && \
    apk del .build-deps


RUN az login 

WORKDIR /app

COPY . .

RUN yarn install

EXPOSE 3004

CMD yarn run start

우선 이미지 줄이기가 가장 좋은 node:alpine로 돌아갔다.

가장 큰 차이점은 Azure CLI 설치를 apk 패키지 매니저와 pip3로 azure-cli를 설치했다.

이후 apk del을 이용해서 필요하지 않는 패키지를 제거하여 이미지 크기를 최소화 했다.

 

그 결과 1.64GB에서 1.48GB가 되었지만 드라마틱하게 바뀌지 않았다.

 

 

최종 도커 이미지 수정 - 1.13GB

# Build stage
# 빌드 스테이지에서 먼저 alpine 베이스 이미지 기반으로 필요한 패키지 및 라이브러리 설치
# 소스 코드를 복사하여 빌드 수행
# 그 결과 불필요한 캐시 파일 삭제할 수 잇음
FROM node:16-alpine as build

RUN apk add --no-cache curl bash ca-certificates gnupg openssl python3 py3-pip && \
    curl -LO "https://dl.k8s.io/release/$(curl -L -s https://dl.k8s.io/release/stable.txt)/bin/linux/amd64/kubectl" && \
    install -o root -g root -m 0755 kubectl /usr/local/bin/kubectl && \
    apk add --no-cache python3-dev libffi-dev openssl-dev gcc libc-dev make && \
    apk add --no-cache --virtual .build-deps build-base && \
    pip3 install --upgrade pip && \
    pip3 install azure-cli && \
    apk del .build-deps && \
    rm -rf /var/cache/apk/* && \
    rm -rf /root/.cache

WORKDIR /app

COPY . .

# yarn은 npm보다 더욱 빠르고 효율적인 의존성 관리 도구로 추천
# 이미 설치된 패키지를 캐시하여 빌드 속도 향상
# yarn cache clean 명령어를 사용하여 캐시 삭제하여 이미지 크기 최소화
RUN yarn cache clean && \
    rm -rf /usr/local/share/.cache/yarn && \
    rm -rf /root/.cache && \
    rm -rf node_modules && \
    yarn install

# Production stage
# 빌드 스테이지에서 생성된 필요한 파일만을 복사하여 이미지 크기 최소화
FROM node:16-alpine

RUN apk add --no-cache ca-certificates && \
    apk add --no-cache --virtual .build-deps python3-dev libffi-dev openssl-dev gcc libc-dev make && \
    apk add --no-cache py3-pip && \
    pip3 install azure-cli && \
    apk del .build-deps && \
    rm -rf /var/cache/apk/* && \
    rm -rf /root/.cache

COPY --from=build /usr/local/bin/kubectl /usr/local/bin/kubectl

WORKDIR /app

COPY --from=build /app .

EXPOSE 3004

CMD ["yarn", "run", "start"]

도커 이미지에서 사이즈를 줄일 수 있는 방법이 있는데 최종 코드를 보면 할 수 있는 모든 방법을 사용했다.

불필요한 캐시 파일을 삭제하고 최소한의 패키지와 라이브러리만 설치하여 이미지 크기를 최소화하려고 노력했다.

 

덕분에 처음 1.64GB에서 1.13GB까지 총 0.51GB를 줄였다.

내 자신 칭찬해 🫶

 

하지만 그래도 아직도 처음의 300MB에 비하면 터무니하게 이미지가 크다.

그래서 새로운 방법을 찾았는데 그건 2편에서~

 

 

 

 

 

 

 

 

 

728x90
반응형

댓글