Kaip Dockerfile supranta, kad reikia išvalyti cache po komandos 'yum update' įvykdymo?
sobes.tech AI
Atsakymas iš AI
Dockerfile nesupranta, kad reikia išvalyti talpyklą po yum update komandos vykdymo. Docker talpyklos kaupimas grindžiamas Dockerfile komandų turiniu.
Vykdant RUN yum update komandą, Docker kaupia šios komandos rezultatą. Jei RUN yum update eilutės turinys nesikeičia, Docker naudoja išsaugotą sluoksnį.
Norint užtikrinti yum update komandos vykdymą kuriant vaizdą, reikia pridėti kažką į šią komandą, kas keistųsi kiekvieno kūrimo metu arba kai reikia atnaujinti. Dažnas būdas yra pridėti laiko žymą arba atsitiktinį skaičių, nors tai ne visada geriausias sprendimas. Geriau naudoti daugiapakopį kūrimą arba aiškiau valdyti priklausomybes naudojant paketų tvarkyklę.
Tačiau efektyviausias būdas priverstinai išvalyti talpyklą tam tikroje instrukcijoje yra pakeisti jos turinį. Docker traktuoja kiekvieną instrukciją kaip atominę vienetą talpyklai.
Pavyzdžiui, galimas tokios "antitalpyklės" technikos pavyzdys (nerekomenduojama gamybai, bet parodo principą):
RUN yum update -y && echo $(date +%s) > /tmp/update_timestamp
Šis metodas priverčia Docker kiekvieną kartą perstatyti sluoksnį, nes /tmp/update_timestamp faile keičiasi laiko žymė, keičiasi RUN komandos išvestis ir atitinkamai sluoksnio hash'as.
Geriau būdai užtikrinti paketų naujumą:
- Daugiapakopis kūrimas: Atnaujinti priklausomybes viename tarpinio etapo, o tada nukopijuoti tik reikalingus artefaktus į galutinį vaizdą.
- Aiškiai nurodyti paketų versijas: Fiksuoti paketų versijas Dockerfile arba priklausomybių sąrašo faile ir atnaujinti šį failą pagal poreikį.
Procesas, kai Docker išvalo talpyklą tam tikroje instrukcijoje, atrodo taip:
- Docker hash'ina instrukciją Dockerfile (įskaitant argumentus).
- Docker ieško atitinkančio sluoksnio vietiniame talpykloje.
- Jei sluoksnis rastas, jis naudojamas (Talpyklos įvykis).
- Jei sluoksnis nerandamas, instrukcija vykdoma, sukuriamas naujas sluoksnis, ir jis pridedamas prie talpyklos (Talpyklos praleidimas).
- Talpyklos praleidimo metu Docker taip pat išvalo talpyklą visoms vėlesnėms instrukcijoms, užtikrindamas jų vykdymą.
Taigi, yum update pats savaime ne inicijuoja talpyklos išvalymo. Tai įvyksta tik pakeitus pačią RUN yum update instrukciją arba išvalius talpyklą ankstesne instrukcija.