Sobes.tech
Middle

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 update na RUN 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:

  1. Docker číta Dockerfile odhora nadol.
  2. 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.
  3. Ak sa nájde zhoda, Docker znovu použije túto vrstvu a prejde na ďalšiu inštrukciu.
  4. 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 .