도커 레이어를 병합해야 합니까?
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
은 더 적은 계층을 생성하고(몇 가지 명령이 계층을 생성함) 일반적으로 오버헤드가 매우 작으므로 고려하지 마십시오.결론
레이어 수를 줄이는 것 자체가 목표가 아니라 크기를 줄이는 역할을 해야 합니다.
빌드 시간은 물론 풀 타임까지 저하될 수 있다는 점은 아쉽습니다!
적절한 균형 찾기 😃
Reference
이 문제에 관하여(도커 레이어를 병합해야 합니까?), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://dev.to/thibaultduponchelle/do-you-really-need-to-merge-docker-layers-1j1텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)