2017-11-10 16 views
0

도커 이미지가 있고 그것을 축소하거나 크기를 줄이려면 이미지를 축소했다고 가정합니다. 이는 런타임 아티팩트에 유용하기 때문에 저장 및 푸시/풀에 필요한 리소스를 최소한으로 사용할 수 있습니다.도커 이미지를 부숴 버리고 평평하게하지 않으면 레지스트리 캐싱에 나쁜 영향을 미칩니 까?

그러나 컨테이너 저장 부분에 이미지가 저장 될 때 발생하는 계층을 다시 플랫 키 (평평하게 만드는 것)와 다시 사용하는 것 사이에 트레이드 오프가 있는지 궁금합니다.

예를 들면 다음과 같습니다. 여러 개의 레이어가있는 이미지 (일반 오래된 Docker 이미지)가 있고 크기가 500MB 정도라고 가정 해 보겠습니다. 스쿼시 또는 병합을 사용하여 250 MB 크기의 단일 레이어로 압축합니다.

이제 이미지를 변경하고 버전 2를 만들어야한다고 가정 해 보겠습니다. 버전 2는 콘테스트의 후기 레이어에서 아주 조금 변경되었으므로 CMD 지침 바로 전에 설정 파일의 이름을 변경했을 수 있습니다 또는 뭔가.

많은 확장 된 레이어를 레지스트리로 푸시 한 경우이 새로운 이미지를 푸시하려면 다른 최종 레이어 만 레지스트리의 캐시에 저장해야합니다. 이는 전체 크기 (초기 이미지와 새 버전 2 이미지를 함께 사용하는 경우)는 변경된 마지막 레이어에 따라 550MB 또는 그 이상이 될 것입니다.

한편 평면화 한 경우 새 버전 2 이미지는 완전히 새로운 단일 레이어 이미지이며 원래 컨테이너와 공통된 기록이 없습니다. 로컬 Docker 인스턴스는 병합과 관련된 레이어 기록을 볼 수 있지만 레지스트리에는 포함되어 있지 않습니다.

이 경우 레지스트리의 약 500MB를 저장해야합니다. 이미지의 첫 번째 버전과 두 번째 버전은 각각 250MB입니다.

이 작업을 세 번 수행하자마자 병합 된 이미지의 전체 공간은 실제로 입니다. 이는 확장 레이어 이미지의 증분 변경 공간보다 큽니다.

내가 작동하는 방식에 대해 누락 된 것이 있습니까? 컨테이너를 사용하기 위해 컨테이너를 최종 목적지로 보내기 전에 즉시 병합을 수행하기를 원하지만, 이 아닐 경우은 일반적으로 레지스트리에 저장할 때 병합을 수행하려고합니다.

기본 이미지가 너무 커서 평평하게하는 것이 크기가 너무 커지므로 평범한 경우를 이해하려고 시도하고 있는데 레이어의 특정 측면을 설명하는 설명서를 찾을 수 없습니다. 평평하게하다.

답변

1

이미지를 스쿼시하면 캐시 된 이미지 레이어를 사용할 수 없으며 이미지를 여러 개 복사 할 때 사용되는 디스크 공간이 늘어납니다. 이런 이유로 나는 그것이 나의 클라이언트와 사용 된 것을 아직 보지 않았다. 이 작업을 수행하는 가장 좋은 방법은 이미지의 이전 빌드의 캐시를 최대화하도록 Dockerfile을 구성하는 것입니다.

스쿼시에서 이미지 크기가 50 % 감소하는 경우 Dockerfile을 구성하여 레이어 팽창을 방지하는 더 좋은 방법이 있습니다. 스쿼시가 향상되는 일반적인 상황은 COPY이라는 컨텍스트에서 큰 파일을 복사 한 다음 나중에 수정하거나 나중에 RUN 명령에서 삭제해야 할 때입니다. COPYRUN 명령을 함께 연결할 방법이 없습니다.COPYRUN curl http://local-artifact-repo/...으로 변환 할 수 있습니다. 또는 다단계 빌드를 사용하면 이제 모든 COPY 및 다른 RUN 명령을 한 단계에서 수행 한 다음 COPY 개의 결과를 최종 이미지로 수행 할 수 있습니다. 마지막으로 COPY을 지정하면 사소한 변경 만 수행하더라도 완전히 새로운 레이어가 생성되지만 RUN에 명령이 연결됩니다.