[docker] 특정 RUN 명령에 대해 캐시 비활성화

Docker 이미지를 빌드 할 때마다 RUN실행하려는 Dockerfile에 몇 가지 명령이 -no-cache있습니다.

docker build --no-cache전체 Dockerfile에 대해 캐싱을 비활성화 한다는 것을 이해합니다 .

특정 RUN 명령에 대해 캐시를 비활성화 할 수 있습니까?



답변

캐시를 비활성화하려는 지역 앞에 무의미하고 실행하기 쉬운 명령을 삽입하는 옵션이 항상 있습니다.

이 이슈 주석 에서 제안 된대로 빌드 인수 블록을 추가 할 수 있습니다 (이름은 임의적 일 수 있음).

ARG CACHEBUST=1

같은 지역 전에 추가하여 각 실행 값을 수정 --build-arg CACHEBUST=$(date +%s)A와 docker build(실행에서의 고유성을 보장하기 위해, 여기에 현재 날짜이며, 값도 임의 일 수있다) 인수.

물론 이것은 중간 이미지의 해시 합계가 다르기 때문에 이후의 모든 블록에 대해서도 캐시를 비활성화합니다. 이는도 커가 현재 작동하는 방식을 고려하여 진정으로 선택적 캐시를 비활성화하여 사소하지 않은 문제를 비활성화합니다.


답변

사용하다

ADD "https://www.random.org/cgi-bin/randbyte?nbytes=10&format=h" skipcache

항상 실행하려는 RUN 라인 앞에. 이것은 ADD가 항상 파일 / URL을 가져오고 위의 URL이 각 요청에 대해 임의의 데이터를 생성하기 때문에 작동합니다. 그런 다음 Docker는 결과를 비교하여 캐시를 사용할 수 있는지 확인합니다.

또한 추가 Docker 명령 줄 인수가 필요하지 않고 Docker-compose.yaml 파일에서도 작동하므로이를 테스트하고 잘 작동합니다. 🙂


답변

직접적으로는 아니지만 Dockerfile을 여러 부분으로 나누고 이미지를 빌드 한 다음 다음 Dockerfile의 시작 부분에있는이 이미지에서 캐싱을 사용하거나 사용하지 않고 이미지를 빌드 할 수 있습니다.


답변

2016 년 2 월부터는 불가능합니다.

이 기능은 GitHub 에서 요청되었습니다.


답변

이 기능은 일주일 전에 추가되었습니다.

ARG FOO=bar

FROM something
RUN echo "this won't be affected if the value of FOO changes"
ARG FOO
RUN echo "this step will be executed again if the value of FOO changes"

FROM something-else
RUN echo "this won't be affected because this stage doesn't use the FOO build-arg"

https://github.com/moby/moby/issues/1996#issuecomment-550020843


답변

나는 이것이 위의 @steve의 대답에 약간의 개선이라고 생각합니다.

RUN git clone https://sdk.ghwl;erjnv;wekrv;qlk@gitlab.com/your_name/your_repository.git

WORKDIR your_repository

# Calls for a random number to break the cahing of the git clone
# (/programming/35134713/disable-cache-for-specific-run-commands/58801213#58801213)
ADD "https://www.random.org/cgi-bin/randbyte?nbytes=10&format=h" skipcache
RUN git pull

이것은 git 클론의 Docker 캐시를 사용하지만 저장소의 캐시되지 않은 업데이트를 실행합니다.

나타납니다 일에, 그리고 빠른 -하지만 많은 감사는 기본 원칙을 제공 @ 스티브 할 수 있습니다.


답변

또 다른 빠른 해킹은 명령 전에 임의의 바이트를 작성하는 것입니다.

RUN head -c 5 /dev/random > random_bytes && <run your command>

캐시 미스를 강제하는 5 개의 임의 바이트를 작성합니다.