도커 레이어를 병합해야 합니까?

5308 단어 docker


가능한 한 레이어를 병합해야 합니까, 아니면 "잘못된 좋은 생각"입니까?

예 공간 손실로 인해



레이어는 삭제된 데이터도 먹을 수 있습니다...

이것은 매우 나쁩니다:

RUN wget https://ftp.gnu.org/gnu/gcc/gcc-9.2.0/gcc-9.2.0.tar.gz 
...
# untar and install
...
RUN rm gcc-9.2.0.tar.gz


같은 레이어에서 제거하지 않으면 늦습니다 😀

패키지 관리자 캐싱에서도 동일한 문제가 발생합니다.

FROM ubuntu

RUN apt-get update && \
    apt-get install -y tree
RUN rm -rf /var/lib/apt/lists/*

CMD ["bash"]


크기가 많이 증가합니다.


병합된 "가져오기/설치/정리"계층:

FROM ubuntu

RUN apt-get update && \
    apt-get install -y tree && \
    rm -rf /var/lib/apt/lists/*

CMD ["bash"]

tree의 크기만 이미지에 추가합니다.


자세한 내용은 설명하지 않겠습니다. 예를 들어 관련 유용한 리소스가 많이 있습니다how to improve docker image size with layers.

예, 새로운 캐시를 원하기 때문에



다시 말하지만 이것은 매우 나쁩니다.

FROM ubuntu

RUN apt-get update
RUN apt-get install -y nginx


첫째, 방금 전에 설명한 것과 동일한 공간 손실 문제가 있습니다.

뿐만 아니라 새로운 캐시 문제도 있습니다!
apt-get install에 패키지를 하나 더 제공하도록 편집하는 경우:

FROM ubuntu

RUN apt-get update # Will use cached layer if exists 
RUN apt-get install -y nginx tree # Install tree also

docker build는 마지막으로 실행했을 때(아마도 1년 전...) apt-get 캐시를 재사용할 수 있습니다.

대신 단일 RUN 단계에서 두 명령을 병합해야 합니다.

FROM ubuntu

RUN apt-get update && \
    apt-get install -y nginx && \
    rm -rf /var/lib/apt/lists/*


그리고 캐시를 제거하는 것을 잊지 마세요

아니요. 레이어 캐싱을 깨기 때문입니다.



레이어는 당신의 친구입니다 ©️

이것이 Dockerfile을 여러 계층으로 분할해야 하는 이유입니다.
  • 큰 레이어 다운로드/추출이 작은 레이어보다 느림
  • 하나의 큰 레이어를 다운로드하면 병렬화할 수 없고 큰 패널티가 발생합니다
  • 하나의 큰 레이어, 아무것도 공유되지 않음

  • 동일한 도커 이미지 기반의 여러 변형이 있거나 자주 다시 빌드하는 경우 docker build --squash , docker export 또는 다단계로 모든 레이어를 평면화하는 것을 고려하기 전에 두 번 생각하십시오.

    예를 들어 참조"don't use a signle layer image" (Red Hat)

    아니요 왜냐하면 (재)빌드 속도가 느려지기 때문입니다.



    작업 습관에 따라 도커 이미지의 최종 사용자는 실행되지 않을 수 있지만docker build ...하지만 사용자와 CI는...

    따라서 느린 레이어는 다음과 같아야 합니다.

  • 첫 번째 - 다른 레이어가 거의 또는 전혀 트리거할 수 없음

  • 혼자 - 캐싱하고 같은 레이어의 다른 작업이 트리거할 수 없기 때문에

  • 참조 response to "should I minimize the number of docker layers?"

    third antipattern of common dockerfile mistakes도 참조하십시오.

    레이어 메타데이터 오버헤드는 어떻습니까?



    최근docker은 더 적은 계층을 생성하고(몇 가지 명령이 계층을 생성함) 일반적으로 오버헤드가 매우 작으므로 고려하지 마십시오.

    결론



    레이어 수를 줄이는 것 자체가 목표가 아니라 크기를 줄이는 역할을 해야 합니다.

    빌드 시간은 물론 풀 타임까지 저하될 수 있다는 점은 아쉽습니다!

    적절한 균형 찾기 😃

    좋은 웹페이지 즐겨찾기