Փոքրիկ Դոկերի պատկերներ, որոնք հավատում էին իրենց*

[հղում ամերիկյան մանկական «Փոքրիկ շարժիչը, որը կարող էր» հեքիաթին - մոտ. գոտի]*

Փոքրիկ Դոկերի պատկերներ, որոնք հավատում էին իրենց*

Ինչպես ավտոմատ կերպով ստեղծել փոքրիկ Docker պատկերներ ձեր կարիքների համար

Անսովոր մոլուցք

Վերջին մի քանի ամիսների ընթացքում ես տարված էի նրանով, թե որքան փոքր կարող է լինել Docker պատկերը և դեռևս գործարկել հավելվածը:

Հասկանում եմ, միտքը տարօրինակ է։

Նախքան մանրամասների և տեխնիկայի մեջ մտնելը, ես կցանկանայի բացատրել, թե ինչու է այս խնդիրն ինձ այդքան անհանգստացնում և ինչպես է դա վերաբերում ձեզ:

Ինչու է կարևոր չափը

Կրճատելով Docker պատկերի բովանդակությունը՝ մենք դրանով իսկ նվազեցնում ենք խոցելիության ցանկը: Բացի այդ, մենք պատկերներն ավելի մաքուր ենք դարձնում, քանի որ դրանք պարունակում են միայն այն, ինչ անհրաժեշտ է հավելվածները գործարկելու համար:

Կա ևս մեկ փոքր առավելություն՝ պատկերները մի փոքր ավելի արագ են ներբեռնվում, բայց, իմ կարծիքով, դա այնքան էլ կարևոր չէ։

Խնդրում ենք նկատի ունենալ. Եթե դուք մտահոգված եք չափսերով, ապա Alpine-ն ինքնին փոքր է և հավանաբար կհամապատասխանի ձեզ:

Անցրված պատկերներ

Project Distroless առաջարկում է հիմնական «անհրաժեշտ» պատկերների ընտրություն, դրանք չեն պարունակում փաթեթների կառավարիչներ, պատյաններ և այլ կոմունալ ծառայություններ, որոնք դուք սովոր եք տեսնել հրամանի տողում: Արդյունքում, օգտագործեք փաթեթների կառավարիչներ, ինչպիսիք են pip и apt չի աշխատի.

FROM gcr.io/distroless/python3
RUN  pip3 install numpy

Dockerfile՝ օգտագործելով Python 3 առանց դիստրո պատկեր

Sending build context to Docker daemon  2.048kB
Step 1/2 : FROM gcr.io/distroless/python3
 ---> 556d570d5c53
Step 2/2 : RUN  pip3 install numpy
 ---> Running in dbfe5623f125
/bin/sh: 1: pip3: not found

Պիպը նկարում չէ

Սովորաբար այս խնդիրը լուծվում է բազմաստիճան կառուցման միջոցով.

FROM python:3 as builder
RUN  pip3 install numpy

FROM gcr.io/distroless/python3
COPY --from=builder /usr/local/lib/python3.7/site-packages /usr/local/lib/python3.5/

Բազմաստիճան հավաքում

Արդյունքը 130 ՄԲ չափի պատկեր է: Ոչ շատ վատ! Համեմատության համար՝ լռելյայն Python պատկերը կշռում է 929 ՄԲ, իսկ «ավելի բարակ» (3,7-slim) - 179 ՄԲ, ալպիական պատկեր (3,7-alpine) 98,6 ՄԲ է, մինչդեռ օրինակում օգտագործված հիմնական առանց տարածման պատկերը 50,9 ՄԲ է:

Արդար է նշել, որ նախորդ օրինակում մենք պատճենում ենք մի ամբողջ գրացուցակ /usr/local/lib/python3.7/site-packages, որը կարող է պարունակել կախվածություններ, որոնք մեզ պետք չեն: Թեև պարզ է, որ Python-ի բոլոր գոյություն ունեցող բազային պատկերների չափերի տարբերությունը տարբեր է:

Գրելու պահին Google distroless-ը չի աջակցում շատ պատկերներ. Java-ն և Python-ը դեռ փորձնական փուլում են, իսկ Python-ը գոյություն ունի միայն 2,7 և 3,5-ի համար:

Փոքրիկ պատկերներ

Վերադարձ դեպի փոքր պատկերներ ստեղծելու իմ մոլուցքը։

Ընդհանրապես, ես ուզում էի տեսնել, թե ինչպես են կառուցվում անկայուն պատկերները: Առանց տարածման նախագիծն օգտագործում է Google-ի կառուցման գործիքը bazel. Այնուամենայնիվ, Bazel-ի տեղադրումը և ձեր սեփական պատկերները գրելը մեծ աշխատանք պահանջեց (և անկեղծ ասած, անիվը նորից հայտնագործելը զվարճալի և ուսուցողական է): Ես ուզում էի պարզեցնել ավելի փոքր պատկերների ստեղծումը. պատկեր ստեղծելու ակտը պետք է լինի չափազանց պարզ, բանալ. Որպեսզի ձեզ համար կազմաձևման ֆայլեր չլինեն, միայն մեկ տող մխիթարելում. просто собрать образ для <приложение>.

Այսպիսով, եթե ցանկանում եք ստեղծել ձեր սեփական պատկերները, ապա իմացեք, որ կա այդպիսի եզակի դոկերի պատկեր, scratch. Scratch-ը «դատարկ» պատկեր է, դրանում ֆայլեր չկան, թեև այն լռելյայն կշռում է. վայ: - 77 բայթ:

FROM scratch

Scratch պատկեր

Scratch պատկերի գաղափարն այն է, որ դուք կարող եք պատճենել ցանկացած կախվածություն հյուրընկալող մեքենայի մեջ և կամ օգտագործել դրանք Dockerfile-ի ներսում (սա նման է դրանց պատճենմանը. apt և տեղադրեք զրոյից), կամ ավելի ուշ, երբ Docker պատկերը նյութականացվի: Սա թույլ է տալիս ամբողջությամբ վերահսկել Docker կոնտեյների պարունակությունը և այդպիսով ամբողջությամբ վերահսկել պատկերի չափը:

Այժմ մենք պետք է ինչ-որ կերպ հավաքենք այս կախվածությունները: Գոյություն ունեցող գործիքներ, ինչպիսիք են apt թույլ է տալիս ներբեռնել փաթեթներ, բայց դրանք կապված են ընթացիկ մեքենայի հետ և, ի վերջո, չեն աջակցում Windows կամ MacOS-ին:

Այսպիսով, ես ձեռնամուխ եղա ստեղծելու իմ սեփական գործիքը, որն ավտոմատ կերպով կստեղծի հնարավոր ամենափոքր չափի հիմնական պատկերը և կգործարկի ցանկացած հավելված: Ես օգտագործեցի Ubuntu/Debian փաթեթները, ընտրություն կատարեցի (փաթեթներ ստանալով անմիջապես պահեստներից) և ռեկուրսիվորեն գտա դրանց կախվածությունները։ Ծրագիրը պետք է ավտոմատ կերպով ներբեռներ փաթեթի վերջին կայուն տարբերակը՝ հնարավորինս նվազագույնի հասցնելով անվտանգության ռիսկերը։

Ես գործիքի անունը դրեցի fetchy, որովհետև նա... գտնում և բերում է... այն, ինչ պետք է [անգլերենից «բերել», «բերել» - մոտ. գոտի]։ Գործիքը աշխատում է հրամանի տողի միջերեսի միջոցով, բայց միևնույն ժամանակ առաջարկում է API:

Պատկեր հավաքելու համար՝ օգտագործելով fetchy (եկեք այս անգամ Python-ի պատկեր վերցնենք), պարզապես անհրաժեշտ է CLI-ն օգտագործել այսպես. fetchy dockerize python. Ձեզանից կարող է պահանջվել թիրախային օպերացիոն համակարգը և ծածկագիրը, քանի որ fetchy ներկայումս օգտագործում է միայն Debian-ի և Ubuntu-ի վրա հիմնված փաթեթներ:

Այժմ դուք կարող եք ընտրել, թե որ կախվածությունն ընդհանրապես անհրաժեշտ չէ (մեր համատեքստում) և բացառել դրանք։ Օրինակ, Python-ը կախված է perl-ից, չնայած այն լավ է աշխատում առանց Perl-ի տեղադրման:

Արդյունքները

Python պատկերը ստեղծվել է հրամանի միջոցով fetchy dockerize python3.5 կշռում է ընդամենը 35 ՄԲ (ավելի քան վստահ եմ, որ ապագայում այն ​​կարելի է էլ ավելի թեթևացնել)։ Պարզվում է, որ մենք կարողացանք սափրվել ևս 15 WW-ը չթողնված պատկերից:

Դուք կարող եք տեսնել մինչ այժմ հավաքված բոլոր պատկերները այստեղ.

Նախագիծ - այստեղ.

Եթե ​​դուք բացակայում եք գործառույթներ, պարզապես ստեղծեք հարցում, ես ուրախ կլինեմ օգնել :) Ավելին, ես ներկայումս աշխատում եմ փաթեթների այլ կառավարիչների ինտեգրման վրա fetchy-ի մեջ, որպեսզի բազմաստիճան կառուցումների կարիք չլինի:

Source: www.habr.com

Добавить комментарий