programing

특정 RUN 명령에 대해 캐시 사용 안 함

powerit 2023. 9. 15. 21:24
반응형

특정 RUN 명령에 대해 캐시 사용 안 함

몇개 있어요RUN실행할 Docker 파일의 명령어-no-cache도커 이미지를 만들 때마다 말입니다

이해합니다.docker build --no-cache는 전체 도커 파일에 대해 캐싱을 비활성화합니다.

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

캐시를 비활성화할 영역 앞에 무의미하고 저렴한 명령어를 삽입할 수 있는 옵션이 항상 있습니다.

문제 설명에서 제안한 대로 빌드 인수 블록을 추가할 수 있습니다(이름은 임의일 수 있음).

ARG CACHEBUST=1 

해당 영역 이전에, 각 런의 값을 다음을 추가하여 수정합니다.--build-arg CACHEBUST=$(date +%s)로서docker build인수(값은 임의일 수도 있으며, 여기서는 실행 간 고유성을 보장하기 위해 현재 날짜 시간입니다.)

물론 이는 중간 이미지의 해시 합이 다를 것이기 때문에 모든 다음 블록에 대해서도 캐시를 비활성화합니다. 따라서 도커가 현재 작동하는 방식을 고려하여 사소한 문제가 아닌 진정한 선택적 캐시 비활성화가 됩니다.

사용하다

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

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

추가적인 도커 명령줄 인수가 필요하지 않고 도커 컴포지트에서도 작동하기 때문에 저도 이를 테스트했고 잘 작동합니다.yaml 파일 :)

만약 당신의 목표가 Github(또는 유사한)의 최신 코드를 포함하는 것이라면, Github API(또는 동등한 것)를 사용하여 가장 최근의 커밋에 대한 정보를 가져올 수 있습니다.ADD지휘.
docker build항상 에서 URL을 가져올 것입니다.ADD명령어, 그리고 응답이 지난번에 받은 응답과 다른 경우docker buildran, 이후 캐시된 레이어를 사용하지 않습니다.

예를 들면

ADD "https://api.github.com/repos/username/repo_name/commits?per_page=1" latest_commit
RUN curl -sLO "https://github.com/username/repo_name/archive/main.zip" && unzip main.zip

위의 @Bladislav 솔루션을 기반으로 도커 파일에서 사용했습니다.

ARG CACHEBUST=0

이제부터 빌드 캐시를 무효화합니다.

하지만, 날짜나 다른 임의의 값을 넘기는 대신에, 저는 전화를 합니다.

docker build --build-arg CACHEBUST=`git rev-parse ${GITHUB_REF}` ...

어디에GITHUB_REF는 분기 이름입니다(예:main최신 커밋 해시가 사용됩니다.즉, 도커의 빌드 캐시는 이미지를 빌드하는 분기가 마지막 실행 이후 커밋된 경우에만 무효화됩니다.docker build.

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
# (https://stackoverflow.com/questions/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

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

효과가 있는 것으로 보이며, 더 빠르지만, 기본 원칙을 제시해 준 @steve에게 많은 감사를 드립니다.

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

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

캐시 미스를 발생시키는 5개의 랜덤 바이트를 기록합니다.

언급URL : https://stackoverflow.com/questions/35134713/disable-cache-for-specific-run-commands

반응형