2016-07-29 1 views
8

도커의 레이어 캐싱이 얼마나 효과적인지 놀랍지 만 캐시 된 레이어를 사용할지 여부를 결정하는 방법이 궁금합니다. Docker는 빌드 중에 캐시를 사용해야하는 시점과 그렇지 않은 시점을 어떻게 알 수 있습니까?

은의이 예를 들어 빌드 단계를 보자 : 예를 들어

Step 4 : RUN npm install -g node-gyp 
---> Using cache 
---> 3fc59f47f6aa 
Step 5 : WORKDIR /src 
---> Using cache 
---> 5c6956ba5856 
Step 6 : COPY package.json . 
---> d82099966d6a 
Removing intermediate container eb7ecb8d3ec7 
Step 7 : RUN npm install 
---> Running in b960cf0fdd0a 

어떻게 그것이 npm install -g node-gyp의 캐시 계층을 사용할 수 있습니다 알고 있지만 npm install에 대한 새로운 레이어를 생성합니까?

+3

는 https://docs.docker.com/engine/userguide/eng-image/dockerfile_best-practices/#build-cache을 읽게한다? – Roman

답변

3

package.json 파일이 수정 되었기 때문입니다 (Removing intermediate container 참조).

패키지 관리자 (공급 업체/제 3 자) 정보 파일이 인 첫 번째 메시지는 docker build입니다. 그런 다음 패키지 관리자 설치를 실행 한 다음 나머지 애플리케이션 (예 : src)을 추가합니다.

라이브러리를 변경하지 않은 경우이 단계는 빌드 캐시에서 제공됩니다.

+0

그 캐시는 또한'Dockerfile' – Matt

9

빌드 캐시 프로세스는 Dockerfile best practices build cache 섹션에서 상당히 자세히 설명됩니다. 그 중 하나가 동일한 명령을 사용하여 구축 된 경우 캐시에 이미 기본 이미지로 시작

  • , 다음 명령은 볼이 기본 이미지에서 파생 된 모든 자식 이미지와 비교됩니다 . 그렇지 않으면 캐시가 무효화됩니다.

  • 대부분의 경우 단순히 Dockerfile의 명령어와 하위 이미지 중 하나를 비교하는 것으로 충분합니다. 그러나 특정 지침은 좀 더 자세히 조사하고 설명해야합니다.

  • ADDCOPY 지침의 경우 이미지의 파일 내용이 검사되고 각 파일에 대해 체크섬이 계산됩니다. 파일의 최종 수정 시간 및 최종 액세스 시간은 으로 간주되지 않습니다. 캐시 조회 중에 체크섬 은 기존 이미지의 체크섬과 비교됩니다. 콘텐츠 및 메타 데이터와 같은 파일에서 이 변경된 경우 캐시가 무효화됩니다.

  • 캐시 확인은 캐시 일치를 결정하기 위해 컨테이너의 파일을 보지 않습니다. ADDCOPY 명령을 제외하고 캐시 검사는 컨테이너의 파일을 조사하지 않습니다. 예제의 경우 명령을 처리 할 때 컨테이너에 업데이트 된 파일을 검사하여 캐시가 적중 여부를 확인하지 않습니다. 이 경우 명령 문자열 자체 만 으로 사용되어 일치하는 것을 찾습니다. 캐시가 무효화되면

는, 이후의 모든 Dockerfile 명령 새로운 이미지를 생성하고 캐시가 사용되지 않습니다.

당신은 OS 패키지, NPM 패키지 또는 힘내의 repo가 ​​최신 버전으로 업데이트하는 상황으로 실행됩니다

(예를 들어 package.json에서 ~2.3 semver)하지만 같은 Dockerfile 또는 package.json 업데이트하지 않았습니다, 고정 표시기는 계속 사용됩니다 은닉처.

더 똑똑한 검사 (예 : 복제 명령에서 사용할 저장소에서 최신 git branch shasum 검색)를 수정하여 캐시를 파기하는 프로그래밍 방식으로 Dockerfile을 생성 할 수 있습니다. --no-cache=true으로 주기적으로 빌드를 실행하여 업데이트를 적용 할 수도 있습니다.

+0

캐시를 깰 수있는 또 다른 옵션의 지시 사항의 변경에 의해 무효화 될 수있는 당신의 패키지에 대한 고정 된 버전을 사용하고 진정한 – Ohmen

+0

@Ohmen, 당신은 고정 비슷한 할 수있는 dockerfile 내부를 수동으로 실시를 업데이트하는 것입니다 버전도'package.json'에 있습니다. 그것도 여전히 패키지 종속성에 의해 잡힐 가능성이 있습니다. – Matt

+0

그러나 dockerfile에서 버전을 수동으로 업데이트하면 docker가 캐시를 사용하지 않고 cmd를 다시 실행하도록하는 동일한 명령이 아닙니다. – Ohmen

관련 문제