Ako sa vykonáva kešovanie v Docker?
sobes.tech AI
Odpoveď od AI
Konzistencia v Dockeri saťahuje na základe vrstiev pri zostavovaní obrazu. Dockerfile sa skladá z inštrukcií, z ktorých každá vytvára novú vrstvu. Pri následných zostavovaniach, ak sa inštrukcia a jej kontext nezmenili, Docker používa existujúcu vrstvu z cache namiesto opätovného vykonania inštrukcie.
Faktory ovplyvňujúce invalidáciu cache:
- Zmena inštrukcie: Akákoľvek zmena v samotnej inštrukcii (napríklad
RUN apt-get updatenaRUN apt-get install). - Zmena v kontexte: Zmena súborov alebo adresárov používaných inštrukciou (
COPY,ADD). Napríklad zmena obsahu súboru, ktorý sa kopíruje do obrazu. - Poradie inštrukcií: Zmena poradia inštrukcií v Dockerfile.
- Použitie
--no-cache: Jasné vypnutie cache pre celé zostavenie.
Proces cacheovania:
- Docker číta Dockerfile odhora nadol.
- Pre každú inštrukciu kontroluje, či existuje vrstva v lokálnej cache, ktorá zodpovedá presne tej istej predchádzajúcej inštrukcii a kontextu.
- Ak sa nájde zhoda, Docker znovu použije túto vrstvu a prejde na ďalšiu inštrukciu.
- Ak zhoda nie je nájdená (cache je invalidovaný), Docker vykoná inštrukciu, vytvorí novú vrstvu a pridá ju do cache. Všetky nasledujúce inštrukcie po invalidovanej inštrukcii tiež nebudú používať cache.
Príklad vplyvu poradia inštrukcií:
Predstavte si, že máte Dockerfile, ktorý najskôr kopíruje váš kód a potom inštaluje závislosti. Ak často meníte kód, ale zriedka závislosti, cache inštalácie závislostí bude zbytočná, pretože pri každej zmene kódu bude cache invalidovaná na kroku COPY.
# Dockerfile 1 (Zlé cacheovanie pri častých zmenách kódu)
COPY . /app
RUN pip install -r requirements.txt
Zmena poradia inštrukcií môže zlepšiť cacheovanie:
# Dockerfile 2 (Dobrého cacheovania pri častých zmenách kódu)
COPY requirements.txt /app/
RUN pip install -r /app/requirements.txt
COPY . /app
V tomto prípade, ak sa zmení iba kód (nie requirements.txt), cache pre RUN pip install bude zachovaná.
Inštrukcie ADD a COPY používajú hash obsahu súborov na invalidáciu cache.
Príkaz docker build predvolene používa cache. Na vypnutie cache sa používa príznak --no-cache.
# S buildom s použitím cache (predvolene)
docker build -t myimage .
# S buildom bez použitia cache
docker build --no-cache -t myimage .