Sobes.tech
Middle

Как се извършва кеширането в Docker?

sobes.tech AI

Отговор от AI

Кеширането в Docker се извършва въз основа на слоеве при създаването на образа. Dockerfile се състои от инструкции, всяка от които създава нов слой. При последващи създавания, ако инструкцията и нейният контекст не са се променили, Docker използва съществуващ слой от кеша вместо да изпълнява инструкциите отново.

Фактори, влияещи върху invalidation на кеша:

  • Промяна в инструкцията: Всяка промяна в самата инструкция (например, RUN apt-get update към RUN apt-get install).
  • Промяна в контекста: Промяна в файловете или директориите, използвани от инструкцията (COPY, ADD). Например, промяна в съдържанието на файл, който се копира в образа.
  • Редът на инструкциите: Промяна в реда на инструкциите в Dockerfile.
  • Използване на --no-cache: Явно деактивиране на кеширането за цялото създаване.

Процес на кеширане:

  1. Docker чете Dockerfile отгоре надолу.
  2. За всяка инструкция проверява дали съществува слой в локалния кеш, който съответства на точно същата предишна инструкция и контекст.
  3. Ако съвпадението е намерено, Docker повторно използва този слой и преминава към следващата инструкция.
  4. Ако съвпадението НЕ е намерено (кешът е invalid), Docker изпълнява инструкцията, създава нов слой и го добавя към кеша. Всички следващи инструкции след invalidирана инструкция също няма да използват кеш.

Пример за влияние на реда на инструкциите:

Представете си, че имате Dockerfile, който първо копира вашия код, а след това инсталира зависимости. Ако често променяте кода, но рядко променяте зависимостите, кеширането на инсталирането на зависимости ще е безполезно, тъй като всеки път при промяна на кода кешът ще бъде invalidиран на стъпката COPY.

# Dockerfile 1 (Лошо кеширане при чести промени в кода)
COPY . /app
RUN pip install -r requirements.txt

Промяната в реда на инструкциите може да подобри кеширането:

# Dockerfile 2 (Добро кеширане при чести промени в кода)
COPY requirements.txt /app/
RUN pip install -r /app/requirements.txt
COPY . /app

В този случай, ако се промени само кодът (не requirements.txt), кешът за RUN pip install ще бъде запазен.

Инструкциите ADD и COPY използват хеш на съдържанието на файловете за invalidation на кеша.

Командата docker build по подразбиране използва кеш. За деактивиране на кеширането се използва флагът --no-cache.

# Създаване с използване на кеш (по подразбиране)
docker build -t myimage .

# Създаване без използване на кеш
docker build --no-cache -t myimage .