노드 Docker 이미지 크기를 10배 줄이는 방법

애플리케이션을 도커화하는 것은 간단하고 효과적이지만 도커 이미지의 크기를 최적화하는 것은 까다로운 부분입니다. Docker는 사용하기 쉽지만 애플리케이션이 크기 조정을 시작하면 이미지 크기가 기하급수적으로 늘어납니다. 일반적으로 애플리케이션의 노드 도커 이미지 크기는 대부분 1GB 이상입니다.

크기가 중요한 이유


  • 큰 도커 이미지 크기 - 이미지 크기가 클수록 더 많은 공간이 필요하므로 비용이 증가합니다.
  • 긴 빌드 기간 - 네트워크를 통해 이미지를 푸시하는 데 시간이 오래 걸리고 CI 파이프라인 지연이 발생합니다.

  • 최적화를 시작합시다



    다음은 VueJS 애플리케이션을 사용하여 빌드한 demo application입니다.

    다음은 초기 Dockerfile입니다.

    FROM node:10
    
    WORKDIR /app
    
    COPY . /app
    
    EXPOSE 8080
    
    RUN npm install http-server -g
    
    RUN npm install && npm run build
    
    CMD http-server ./dist
    


    이 이미지의 크기는 다음과 같습니다.



    1.34GB입니다! 이런!

    단계별 최적화를 시작하겠습니다.

    1) 다단계 Docker 빌드 사용

    다단계 빌드를 사용하면 단일 Dockerfile에서 여러 중간 이미지를 사용하여 Docker 이미지를 쉽게 최적화할 수 있습니다. 그것에 대해 자세히 읽어보십시오here. 다단계 빌드를 사용하여 빌드 이미지에 모든 종속성을 설치하고 더 간결한 런타임 이미지에 복사할 수 있습니다.

    FROM node:10 AS BUILD_IMAGE
    
    WORKDIR /app
    
    COPY . /app
    
    EXPOSE 8080
    
    RUN npm install && npm run build
    
    FROM node:10
    
    WORKDIR /app
    
    # copy from build image
    COPY --from=BUILD_IMAGE /app/dist ./dist
    COPY --from=BUILD_IMAGE /app/node_modules ./node_modules
    
    RUN npm i -g http-server
    
    CMD http-server ./dist
    


    이제 이 이미지의 크기는 1.24GB입니다.



    2) 개발 종속성 제거 및 노드 정리 도구 사용

    node-prune은 node_modules 폴더에서 불필요한 파일을 제거하기 위한 오픈 소스 도구입니다. Npm 패키지의 테스트 파일, 마크다운 파일, 타이핑 파일 및 *.map 파일은 일반적으로 프로덕션 환경에서 전혀 필요하지 않으며 대부분의 개발자는 프로덕션 패키지에서 제거하지 않습니다. node-prune을 사용하면 안전하게 제거할 수 있습니다.

    이를 사용하여 개발 종속성을 제거할 수 있습니다.

    npm prune --production
    


    이러한 변경을 수행한 후Dockerfile는 다음과 같습니다.

    FROM node:10 AS BUILD_IMAGE
    
    RUN curl -sfL https://install.goreleaser.com/github.com/tj/node-prune.sh | bash -s -- -b /usr/local/bin
    
    WORKDIR /app
    
    COPY . /app
    
    EXPOSE 8080
    
    RUN npm install && npm run build
    
    # remove development dependencies
    RUN npm prune --production
    
    # run node prune
    RUN /usr/local/bin/node-prune
    
    FROM node:10
    
    WORKDIR /app
    
    # copy from build image
    COPY --from=BUILD_IMAGE /app/dist ./dist
    COPY --from=BUILD_IMAGE /app/node_modules ./node_modules
    
    RUN npm i -g http-server
    
    CMD http-server ./dist
    


    이를 사용하여 전체 크기를 1.09GB로 줄였습니다.



    3) 더 작은 최종 기본 이미지 선택

    노드 애플리케이션을 도킹할 때 선택할 수 있는 항목base images이 많이 있습니다.

    여기서는 알파인 이미지를 사용합니다. alpine은 최소한의 패키지를 포함하지만 노드 애플리케이션을 실행하기에 충분한 린(lean) 도커 이미지입니다.

    FROM node:10 AS BUILD_IMAGE
    
    RUN curl -sfL https://install.goreleaser.com/github.com/tj/node-prune.sh | bash -s -- -b /usr/local/bin
    
    WORKDIR /app
    
    COPY . /app
    
    EXPOSE 8080
    
    RUN npm install && npm run build
    
    # remove development dependencies
    RUN npm prune --production
    
    # run node prune
    RUN /usr/local/bin/node-prune
    
    FROM node:10-alpine
    
    WORKDIR /app
    
    # copy from build image
    COPY --from=BUILD_IMAGE /app/dist ./dist
    COPY --from=BUILD_IMAGE /app/node_modules ./node_modules
    
    RUN npm i -g http-server
    
    CMD http-server ./dist
    


    이것을 사용하면 Dockerfile 이미지 크기가 157MB로 떨어집니다.\o/



    결론



    이 3가지 간단한 단계를 적용하여 도커 이미지 크기를 10배 줄였습니다.

    건배!

    좋은 웹페이지 즐겨찾기