Hogyan történik a cache-elés Dockerben?
sobes.tech MI
Válasz az MI-től
A Docker cache a rétegeken alapul a kép építése során. A Dockerfile utasításokból áll, amelyek mindegyike egy új réteget hoz létre. A későbbi építéseknél, ha az utasítás és a kontextus nem változott, a Docker a meglévő cache réteget használja az utasítás újrafuttatása helyett.
A cache érvénytelenségét befolyásoló tényezők:
- Utasítás változása: Bármilyen változás az utasításban (pl.
RUN apt-get updatehelyettRUN apt-get install). - Kontektsz változása: A fájlok vagy könyvtárak változása, amelyeket az utasítás használ (
COPY,ADD). Például a másolt fájl tartalmának módosítása. - Utasítások sorrendje: Az utasítások sorrendjének megváltoztatása a Dockerfile-ban.
--no-cachehasználata: A cache kifejezett kikapcsolása az egész építés során.
A cache folyamat:
- A Docker olvassa a Dockerfile-t fentről lefelé.
- Minden utasításnál ellenőrzi, hogy létezik-e egy olyan réteg a helyi cache-ben, amely pontosan megfelel az előző utasításnak és kontextusnak.
- Ha talál egyezést, a Docker újra felhasználja ezt a réteget, és a következő utasításra lép.
- Ha nem talál egyezést (a cache érvénytelen), a Docker végrehajtja az utasítást, létrehoz egy új réteget, és hozzáadja a cache-hez. Az érvénytelenített réteget követő összes utasítás szintén nem fogja használni a cache-t.
Példa az utasítások sorrendjének hatására:
Tegyük fel, hogy van egy Dockerfile, amely először másolja a kódodat, majd telepíti a függőségeket. Ha gyakran változtatod a kódot, de ritkán a függőségeket, a függőségek telepítésének cache-e haszontalan lesz, mert minden alkalommal, amikor a kód változik, a COPY lépésnél a cache érvénytelen lesz.
# Dockerfile 1 (Rossz cache gyakran változó kód esetén)
COPY . /app
RUN pip install -r requirements.txt
A sorrend megváltoztatásával javítható a cache:
# Dockerfile 2 (Jó cache gyakran változó kód esetén)
COPY requirements.txt /app/
RUN pip install -r /app/requirements.txt
COPY . /app
Ebben az esetben, ha csak a kód változik (nem a requirements.txt), a RUN pip install cache-e megmarad.
Az ADD és COPY utasítások a fájlok tartalmának hash-ét használják a cache érvénytelenítésére.
A docker build alapértelmezés szerint használja a cache-t. A cache kikapcsolásához használja a --no-cache zászlót.
# Cache használatával történő építés (alapértelmezett)
docker build -t myimage .
# Cache nélkül
docker build --no-cache -t myimage .