Sobes.tech
Middle
151

Jak je v Dockeru prováděno cachování?

Odpověď od AI

sobes.tech AI

Kešování v Dockeru je založeno na vrstvách během sestavení obrazu. Dockerfile se skládá z instrukcí, z nichž každá vytváří novou vrstvu. Při následných sestaveních, pokud se instrukce a její kontext nezměnily, Docker používá existující vrstvu z cache místo opětovného provedení instrukce.

Faktory ovlivňující neplatnost cache:

  • Změna instrukce: Jakákoli změna v samotné instrukci (například z RUN apt-get update na RUN apt-get install).
  • Změna kontextu: Změna souborů nebo adresářů používaných instrukcí (COPY, ADD). Například změna obsahu souboru, který je kopírován do obrazu.
  • Pořadí instrukcí: Změna pořadí instrukcí v Dockerfile.
  • Použití --no-cache: Výslovné vypnutí cache pro celou sestavovací operaci.

Proces kešování:

  1. Docker čte Dockerfile shora dolů.
  2. Pro každou instrukci kontroluje, zda existuje vrstva v místní cache, která přesně odpovídá předchozí instrukci a jejímu kontextu.
  3. Pokud je nalezena shoda, Docker tuto vrstvu znovu použije a přejde k další instrukci.
  4. Pokud shoda není nalezena (cache je neplatná), Docker provede instrukci, vytvoří novou vrstvu a přidá ji do cache. Všechny následující instrukce po neplatné vrstvě také cache nepoužijí.

Příklad vlivu pořadí instrukcí:

Předpokládejme, že máte Dockerfile, který nejdříve kopíruje váš kód a poté instaluje závislosti. Pokud často měníte kód, ale závislosti méně často, cache instalace závislostí bude zbytečná, protože pokaždé, když se kód změní, cache na kroku COPY bude neplatná.

# Dockerfile 1 (Špatná cache při častých změnách kódu)
COPY . /app
RUN pip install -r requirements.txt

Změna pořadí instrukcí může zlepšit kešování:

# Dockerfile 2 (Dobré kešování při častých změnách kódu)
COPY requirements.txt /app/
RUN pip install -r /app/requirements.txt
COPY . /app

V tomto případě, pokud se změní pouze kód (ne requirements.txt), bude cache pro RUN pip install zachována.

Instrukce ADD a COPY používají hash obsahu souborů k neplatnosti cache.

Příkaz docker build používá výchozí cache. Pro její vypnutí použijte přepínač --no-cache.

# Sestavení s cache (výchozí)
docker build -t myimage .

# Bez cache
docker build --no-cache -t myimage .