Kā Dockerfile saprot, ka pēc komandas 'yum update' ir jānotīra kešatmiņa?
sobes.tech AI
Atbilde no AI
Dockerfile nesaprot, ka nepieciešams notīrīt kešatmiņu pēc yum update komandas izpildes. Docker kešošana balstās uz Dockerfile komandu saturu.
Izpildot RUN yum update komandu, Docker kešē šīs komandas rezultātu. Ja RUN yum update rinda nemainās, Docker izmanto kešēto slāni.
Lai nodrošinātu yum update komandas izpildi, būvējot attēlu, ir jāpievieno kaut kas šai komandai, kas mainīsies katrā būvē vai nepieciešamības gadījumā atjaunojot. Biežs veids ir pievienot laika zīmi vai nejaušu skaitli, lai gan tas nav vienmēr labākais risinājums. Labāk ir izmantot daudzposmu būvniecību vai skaidrāk pārvaldīt atkarības ar pakotņu pārvaldnieku.
Tomēr efektīvākais veids, kā piespiedu notīrīt kešatmiņu noteiktā instrukcijā, ir mainīt tās saturu. Docker katru instrukciju traktē kā atomu vienību kešatmiņai.
Piemērs potenciālai šādas "antikeš" tehnikas izmantošanai (neieteicams ražošanai, bet parāda principu):
RUN yum update -y && echo $(date +%s) > /tmp/update_timestamp
Šī metode liek Docker katru reizi pārveidot slāni, jo /tmp/update_timestamp failā mainās laika zīme, mainās RUN komandas izvade un attiecīgi slāņa hašs.
Labākas pieejas, lai nodrošinātu pakotņu aktuālitāti:
- Daudzposmu būvniecība: Atjaunināt atkarības vienā starpposma stadijā, pēc tam tikai nokopēt nepieciešamos artefaktus galīgajā attēlā.
- Skaidri norādīt pakotņu versijas: Fiksēt pakotņu versijas Dockerfile vai atkarību saraksta failā un atjaunināt šo failu pēc vajadzības.
Process, kad Docker notīra kešatmiņu noteiktā instrukcijā, izskatās šādi:
- Docker hashē instrukciju Dockerfile (ieskaitot argumentus).
- Docker meklē atbilstošo slāni vietējā kešā.
- Ja slānis ir atrasts, tas tiek izmantots (Kešs Hit).
- Ja slānis nav atrasts, instrukcija tiek izpildīta, tiek izveidots jauns slānis, un tas tiek pievienots kešam (Kešs Miss).
- Kešs Miss gadījumā Docker arī notīra kešatmiņu visām sekojošajām instrukcijām Dockerfile, nodrošinot to izpildi.
Tādējādi, yum update pats par sevi neizraisa kešatmiņas notīrīšanu. Tas notiek tikai tad, ja mainās pati RUN yum update instrukcija vai ja iepriekšējā instrukcija notīra kešatmiņu.