Dockeri puhverdamise probleem

Joel Edenberg

Docker võimaldab ehitamisel enda vahekihtide puhverdamist. See tähendab, et uuesti kokkuehitamisel pole vaja juba puhvris olevaid vahekihte uuesti ehitada, ning neid lihtsalt taaskasutatakse. See on väga hea võimalus, kuna kiirendab protsessi ja väldib dupleerivat tööd. Kuid on olukordi, kus see ei ole päris soovitud tulemus

Turvauuendused vahekihtides

Probleem tekib, kui mõnes Dockeri sammus soovitakse uuendada väliseid sõltuvusi või teeke. Näiteks nii:

RUN apk update && apk upgrade --no-cache

Kuna tegemist on staatilise käsuga, siis tegelikult puhverdatakse ka loodud vahekiht. Seega järgnevad Dockeri ehitamised tegelikult seda käsku enam uuesti ei jooksuta, ning kasutatakse varasemat vahekihti. Tulemusek on olukord, kus tegelikult viimaseid uuendusi ei kontrollita ja olulised uuendused võivad jääda puuduma.

Puhverdamise keelamine

Üks variant selle probleemi lahendamiseks on keelata puhverdamine täielikult.

docker build --no-cache .

Aga sellisel juhul jääb kogu puhverdamisest ilma - ka sammudes, kus seda võiks tegelikult kasutada. Natukene parem variant on käsitsi juhtida puhverdamist, kasutades argumente. Nimelt, kui Dockeri käsk sisaldab dünaamilisi argumente (väärtustatakse käivitamise hetkel), siis ka puhverdamine toimub nende argumentide väärtuste põhjal. Kui näiteks kasutada alati muutuvat argumenti puhverdamise "keelamiseks":

ARG REFRESHED_AT
RUN echo "Refreshed at ${REFRESHED_AT}" && apk update && apk upgrade --no-cache

ja käivitada

docker build --build-arg REFRESHED_AT=$(date +%Y%m%d%H%M%S) .

Siis apk update kiht ehitatakse uuesti, kuna käsus kasutati uue väärtusega REFRESHED_AT argumenti.

Tegelikult on kaasaegses Dockeris see probleem lahendatud ka argumendi --no-cache-filter=<ehitusfaasi-nimi> abil.

FROM alpine:3.20 AS base
RUN apk update && apk upgrade --no-cache
FROM base AS build
...

Ja siis käivitada:

docker buildx build --no-cache-filter base -t myimage .

Sellisel juhul ehitatakse ainult base faas uuesti, samas kui build faasi vahekihid jäävad puhverdatuks (juhul kui seal ei ole muutuseid).