Sobes.tech
Middle

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 update helyett RUN 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-cache használata: A cache kifejezett kikapcsolása az egész építés során.

A cache folyamat:

  1. A Docker olvassa a Dockerfile-t fentről lefelé.
  2. 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.
  3. Ha talál egyezést, a Docker újra felhasználja ezt a réteget, és a következő utasításra lép.
  4. 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 .