Hoe wordt caching gedaan in Docker?
sobes.tech AI
Antwoord van AI
Caching in Docker is gebaseerd op lagen tijdens het bouwen van het beeld. Het Dockerfile bestaat uit instructies, waarvan elke instructie een nieuwe laag creëert. Bij volgende builds, als de instructie en de context niet zijn veranderd, gebruikt Docker de bestaande laag uit de cache in plaats van de instructie opnieuw uit te voeren.
Factoren die de invalidatie van de cache beïnvloeden:
- Wijziging in instructie: Elke wijziging in de instructie zelf (bijvoorbeeld van
RUN apt-get updatenaarRUN apt-get install). - Wijziging in context: Wijziging van bestanden of mappen die door de instructie worden gebruikt (
COPY,ADD). Bijvoorbeeld, het wijzigen van de inhoud van een bestand dat wordt gekopieerd naar het beeld. - Volgorde van instructies: Het wijzigen van de volgorde van instructies in het Dockerfile.
- Gebruik van
--no-cache: Expliciet uitschakelen van de cache voor de hele build.
Proces van caching:
- Docker leest het Dockerfile van boven naar beneden.
- Voor elke instructie controleert het of er een bestaande laag in de lokale cache is die exact overeenkomt met de vorige instructie en context.
- Als er een overeenkomst wordt gevonden, hergebruikt Docker die laag en gaat door naar de volgende instructie.
- Als er geen overeenkomst wordt gevonden (cache wordt ongeldig), voert Docker de instructie uit, maakt een nieuwe laag en voegt deze toe aan de cache. Alle volgende instructies na de ongeldig verklaarde laag gebruiken ook geen cache.
Voorbeeld van invloed van de volgorde van instructies:
Stel dat je een Dockerfile hebt die eerst je code kopieert en daarna afhankelijkheden installeert. Als je vaak de code wijzigt, maar zelden de afhankelijkheden, is de cache voor het installeren van afhankelijkheden nutteloos, omdat elke keer dat de code wijzigt, de cache bij COPY ongeldig wordt.
# Dockerfile 1 (Slechte cache bij frequente codewijzigingen)
COPY . /app
RUN pip install -r requirements.txt
Het wijzigen van de volgorde van instructies kan de caching verbeteren:
# Dockerfile 2 (Goede cache bij frequente codewijzigingen)
COPY requirements.txt /app/
RUN pip install -r /app/requirements.txt
COPY . /app
In dit geval, als alleen de code wijzigt (niet requirements.txt), blijft de cache voor RUN pip install behouden.
De instructies ADD en COPY gebruiken een hash van de inhoud van de bestanden om de cache te ongeldig maken.
Het docker build-commando gebruikt standaard de cache. Om deze uit te schakelen, wordt de vlag --no-cache gebruikt.
# Bouwen met cache (standaard)
docker build -t myimage .
# Bouwen zonder cache
docker build --no-cache -t myimage .