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 updatenaRUN 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í:
- Docker čte Dockerfile shora dolů.
- Pro každou instrukci kontroluje, zda existuje vrstva v místní cache, která přesně odpovídá předchozí instrukci a jejímu kontextu.
- Pokud je nalezena shoda, Docker tuto vrstvu znovu použije a přejde k další instrukci.
- 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 .