Si të bëni Docker të rindërtojë një imazh pa cache-në e tij
Docker ruan rezultatet e krijimit të imazheve për të përshpejtuar rindërtimet e mëvonshme. Ndërsa ky mekanizëm është përgjithësisht i besueshëm, ndonjëherë do të dëshironi të rindërtoni një imazh pa përdorur cache. Kjo mund të jetë për të diagnostikuar problemet ose për të kontrolluar se procedura e plotë e ndërtimit do të jetë e riprodhueshme në një mjedis të pastër.
Në këtë artikull, do të mësoni se si të arrini një ndërtim të ri pa fshirë manualisht cache. Do të shihni gjithashtu se si të tërheqni imazhe bazë të përditësuara në mënyrë që ndërtimi juaj të përputhet me rezultatin që do të prodhonte një instalim i ri Docker.
Si funksionon cache
Këtu është një Dockerfile e thjeshtë:
FROM alpine:latest
COPY 1.txt /1.txt
COPY 2.txt /2.txt
Plotësoni skedarët e mostrës në drejtorinë tuaj të punës dhe ndërtoni imazhin:
$ echo 1 > 1.txt
$ echo 2 > 2.txt
$ docker build -t demo:latest .
Prodhimi do të duket i ngjashëm me këtë:
Sending build context to Docker daemon 5.12kB
Step 1/3 : FROM alpine:latest
---> 9c6f07244728
Step 2/3 : COPY 1.txt /1.txt
---> db61ff73c0b5
Step 3/3 : COPY 2.txt /2.txt
---> f1129e47fc12
Successfully built f1129e47fc12
Successfully tagged demo:latest
Tani modifikoni 2.txt
dhe më pas rindërtoni imazhin:
$ echo two > 2.txt
$ docker build -t demo:latest .
Sending build context to Docker daemon 5.12kB
Step 1/3 : FROM alpine:latest
---> 9c6f07244728
Step 2/3 : COPY 1.txt /1.txt
---> Using cache
---> db61ff73c0b5
Step 3/3 : COPY 2.txt /2.txt
---> 75ba7d786049
Successfully built 75ba7d786049
Successfully tagged demo:latest
Faza e dytë e ndërtimit tregon Përdorimi i cache-it
sepse përmbajtja e 1.txt
nuk ka ndryshuar. Shtresa e ndërmjetme me ID db61ff73c0b5
ripërdoret për ndërtimin e ri.
Çaktivizimi i cache
Mund të çaktivizoni përdorimin e memories së shtresës së ndërmjetme duke përfshirë flamurin --no-cache
kur ekzekutoni docker build
:
$ echo second > 2.txt
$ docker build --no-cache -t demo:latest .
Sending build context to Docker daemon 5.12kB
Step 1/3 : FROM alpine:latest
---> 9c6f07244728
Step 2/3 : COPY 1.txt /1.txt
---> 1590b2407dd4
Step 3/3 : COPY 2.txt /2.txt
---> afb31630ce32
Successfully built afb31630ce32
Successfully tagged demo:latest
Këtë herë një shtresë e re imazhi, ID 1590b2407dd4
, është krijuar nga faza e dytë e ndërtimit, edhe pse 1.txt
mbetet e pandryshuar.
Ju mund të përdorni flamurin --no-cache
për të detyruar një rindërtim kur dyshoni se cache është i vjetëruar ose dëshironi të filloni nga e para. Performanca e ndërtimit do të reduktohet sepse Docker do të duhet të rikrijojë çdo shtresë.
Duke tërhequr imazhet bazë të përditësuara
Një formë tjetër e ruajtjes së memories ka të bëjë me imazhet bazë të cilave u referohet Dockerfile juaj në udhëzimet e tij FROM
. Imazhi shembull i mësipërm përdor alpine:latest
si bazë të tij. Docker nuk do të tërheqë automatikisht një version të përditësuar të alpine:latest
, përveç nëse imazhi nuk ekziston tashmë në hostin tuaj.
Kjo do të thotë se ndërtimi i parë i një Dockerfile do të tërheqë imazhet bazë që ju nevojiten, për sa kohë që nuk i keni ato tashmë. Rindërtimet e mëvonshme nuk do të rifreskojnë imazhet, kështu që ju mund të ndërtoni mbi një bazë të vjetëruar. Ndërtimi i imazhit në një host tjetër Docker mund të mos prodhojë të njëjtin rezultat nëse ai host tërheq një version më të ri të bazës.
Ju mund ta detyroni Docker të kontrollojë për imazhe bazë të përditësuara në kohën e ndërtimit duke shtuar flamurin --pull
në komandën tuaj docker build
. Kjo është e ndarë nga --pa-cache
. Përdorimi i --pull
do të marrë manifestin e etiketës së imazhit nga regjistri i tij dhe do ta krahasojë atë me versionin në kompjuterin tuaj. Imazhi i ri do të tërhiqet nga regjistri kur të ketë një mospërputhje në manifeste.
$ docker build --no-cache --pull -t demo:latest .
Sending build context to Docker daemon 5.12kB
Step 1/3 : FROM alpine:latest
latest: Pulling from library/alpine
Digest: sha256:bc41182d7ef5ffc53a40b044e725193bc10142a1243f395ee852a8d9730fc2ad
Status: Image is up to date for alpine:latest
---> 9c6f07244728
Step 2/3 : COPY 1.txt /1.txt
---> 4fee970dfaab
Step 3/3 : COPY 2.txt /2.txt
---> 60d2e3fff0fb
Successfully built 60d2e3fff0fb
Successfully tagged demo:latest
Shembulli i mësipërm tregon se si ndryshon prodhimi i ndërtimit kur përdoret flamuri --pull
. Docker përpiqet të tërheqë imazhin bazë Alpine, edhe pse është tashmë në makinë nga ndërtimet e mëparshme të shembullit. Përmbledhja e imazhit (SHA) printohet në terminal. Në këtë rast, përmbledhja është e pandryshuar nga versioni lokal, kështu që Docker raporton se imazhi është tashmë i përditësuar.
Flamujt --no-cache
dhe --pull
mund të përdoren në mënyrë të pavarur ose të kombinuar. Shtimi i tyre të dyja ju jep planin më të pastër për fillimin e ndërtimit tuaj, duke e detyruar Docker të kontrollojë për imazhe bazë të përditësuara dhe të shpërfillë çdo shtresë të krijuar më parë. Është e barabartë me ekzekutimin e ndërtimit në një host Docker të sapo instaluar.
Duke përdorur Docker Compose
Docker Compose mbështet edhe flamujt --no-cache
dhe --pull
. Ata kanë të njëjtin efekt si homologët e tyre docker build
.
# Compose v2
$ docker compose build --no-cache --pull
# Compose v1
$ docker-compose build --no-cache --pull
Pastrimi i Build Cache
Ju mund të pastroni cache-in e ndërtimit për të garantuar se nuk përdoret. Kjo gjithashtu ndihmon për të liruar hapësirën e tepërt të diskut të konsumuar nga shtresat e ndërtimit të memorizuara.
Ekzekutoni komandën docker builder prune
për të zbrazur cache-in tuaj. Funksionon vetëm kur ndërtoni imazhe me motorin modern të ndërtimit BuildKit.
$ docker builder prune
Ekzekutimi i komandës pa argumente heq vetëm cache-in e varur të ndërtimit. Kjo lidhet me cache që lidhen me imazhe që nuk janë më të pranishme në hostin tuaj. Shtoni flamurin -a
për të zbrazur plotësisht cache-in, duke përfshirë shtresat që përdoren nga imazhet:
$ docker builder prune -a
Krasitja pranon gjithashtu një flamur --filter
që mund të përdoret për të synuar caches të modifikuara përpara ose që nga një periudhë e caktuar kohore.
# Delete caches modified in the past two hours
$ docker build prune --filter since=2h
# Delete caches modified more than two hours ago
$ docker build prune --filter until=2h
Përmbledhje
Cache-ja e ndërtimit të Docker përmirëson performancën duke ripërdorur shtresat e ndërmjetme të imazhit midis ndërtimeve. Kjo shmang punën e humbur për të rikrijuar shtresa që tashmë ekzistojnë dhe nuk kanë ndryshuar. Ndërsa memoria e ndërtimit është përgjithësisht e dëshirueshme, ka skenarë ku mund të dëshironi të ekzekutoni një ndërtim pa të. Shtimi i flamurit --no-cache
në ndërtimet tuaja ofron një perspektivë të saktë të asaj që ndërtimi do të prodhonte kur të ekzekutohej në një host të ri.
Imazhet e bazës së ndenjur duhet të konsiderohen gjithashtu së bashku me cache-në e ndërtimit. Docker ripërdor versionet lokale të imazheve bazë si parazgjedhje, gjë që mund t'ju bëjë të ndërtoni imazhe të reja në një bazë të vjetëruar. Përdorimi i flamurit --pull
e detyron Docker-in të kontrollojë për imazhe bazë të përditësuara përpara se të fillojë ndërtimin, duke ju dhënë qëndrueshmëri më të madhe në mjedise të ndryshme.