Docker 이미지 크기를 줄이는 작은 팁

안녕하세요 여러분, dev.to에 첫 글을 올립니다. 앞으로 더 활발하게 활동하고 싶습니다!

오늘은 Docker 이미지 크기를 줄이기 위해 최근에 마음에 들었던 작은 팁을 설명하고 싶습니다. 제 경우에는 크기를 절반으로 줄일 수 있었습니다!

Ruby 또는 Python과 같은 언어로 작업한다고 가정해 보겠습니다. 이러한 언어가 컴파일되지 않은 경우에도 제대로 작동하려면 일부 시스템 라이브러리가 필요한 경우가 많습니다. 특히 데이터베이스(MySQL, SQLite, Postgres)로 작업하는 경우 컴파일해야 합니다. 머신의 특정 아키텍처에 대한 gem 또는 라이브러리.

제 경우에는 Ruby로 작업 중이고 안타깝게도 build-base 시스템 라이브러리가 필요한 SQLite gem을 설치하려고 합니다.

내가 작업하고 있는 프로젝트는 다음과 같습니다.
Faenz Analytics

그래서 그것을 설치하고 SQLite gem을 컴파일하고 더 이상 필요하지 않은 모든 것을 제거할 생각이었습니다. 여기 제 Dockerfile이 있습니다.

FROM ruby:3.0.4-alpine3.15
WORKDIR /faenz-analytics
RUN apk update && \
    apk add make && \
    apk add build-base && \ # this takes 200Mb of space!!
    apk add sqlite-dev

# ...some instructions

RUN bundle install  # installing Ruby gems
RUN apk del build-base

# ...some other instructions


쉽죠? build-base를 설치하고 gem을 컴파일 및 설치하고 이미지 크기를 줄이기 위해 제거했습니다build-base.

문제는 이것이 작동하지 않는다는 것입니다! 이미지 크기는 제거하지 않은 것과 동일합니다build-base . 그 이유를 알아봅시다.

우리는 3개의RUN 명령을 작성했으며, 각각은 레이어를 생성하고 이 레이어는 Docker에 의해 결합되어 최종 이미지를 생성합니다.
  • 첫 번째RUN는 시스템 라이브러리
  • 를 설치합니다.
  • 두 번째RUN Ruby 또는 사용 중인 언어로 gem/라이브러리 설치
  • 세 번째RUN는 시스템 라이브러리
  • 를 제거합니다.

    레이어 중 하나에 시스템 라이브러리를 설치했기 때문에 약간의 공간을 차지하고 이미지 크기가 증가하므로 다음 레이어에서 이미지 크기를 줄일 수 있는 방법이 없습니다.

    음수가 없는 합계와 같습니다. 크기는 레이어 간에만 증가하거나 동일하게 유지될 수 있습니다.

    뭐? 포기하지마, 우리가 있어 🚀



    솔루션은 다음과 같습니다. 이러한 작업을 동일한 계층에 배치하십시오!

    FROM ruby:3.0.4-alpine3.15
    WORKDIR /faenz-analytics
    RUN apk update && \
        apk add make && \
        apk add sqlite-dev
    
    # ...some instructions
    
    RUN apk add build-base && \
        bundle install && \
        apk del build-base
    
    # ...some other instructions
    


    단 하나의 RUN 명령으로 작업을 그룹화하면 Docker가 레이어에 build-base를 저장하기 위해 공간을 낭비하는 것을 방지할 수 있습니다. 레이어는 지침이 끝날 때 생성되므로 build-base를 설치하고 사용하고 즉시 제거하여 레이어에 전혀 포함되지 않도록 합니다.

    이 작은 팁으로 내 이미지 크기는 400Mb에서 170MB로 줄어들었습니다.

    마이크로 최적화를 과장하려면 다음 명령으로 생성된 캐시를 삭제하여 동일한 솔루션을 apk update(또는 debian/ubuntu 이미지의 경우 apt-get update)에 적용할 수 있습니다.

    RUN apk update && \
        add build-base && \
        # install other dependencies here...
        bundle install && \
        apk del build-base && \
        rm -rf /var/cache/apk && \
        rm -rf tmp/cache
    


    나는 Docker 전문가가 아니므로 더 나은 솔루션을 알고 있거나 이미지 크기를 줄이는 유사한 팁을 공유하고 싶다면 댓글을 남겨주세요.

    좋은 웹페이지 즐겨찾기