[հղում ամերիկյան մանկական «Փոքրիկ շարժիչը, որը կարող էր» հեքիաթին - մոտ. գոտի]*
Ինչպես ավտոմատ կերպով ստեղծել փոքրիկ Docker պատկերներ ձեր կարիքների համար
Անսովոր մոլուցք
Վերջին մի քանի ամիսների ընթացքում ես տարված էի նրանով, թե որքան փոքր կարող է լինել Docker պատկերը և դեռևս գործարկել հավելվածը:
Հասկանում եմ, միտքը տարօրինակ է։
Նախքան մանրամասների և տեխնիկայի մեջ մտնելը, ես կցանկանայի բացատրել, թե ինչու է այս խնդիրն ինձ այդքան անհանգստացնում և ինչպես է դա վերաբերում ձեզ:
Ինչու է կարևոր չափը
Կրճատելով Docker պատկերի բովանդակությունը՝ մենք դրանով իսկ նվազեցնում ենք խոցելիության ցանկը: Բացի այդ, մենք պատկերներն ավելի մաքուր ենք դարձնում, քանի որ դրանք պարունակում են միայն այն, ինչ անհրաժեշտ է հավելվածները գործարկելու համար:
Կա ևս մեկ փոքր առավելություն՝ պատկերները մի փոքր ավելի արագ են ներբեռնվում, բայց, իմ կարծիքով, դա այնքան էլ կարևոր չէ։
Խնդրում ենք նկատի ունենալ. Եթե դուք մտահոգված եք չափսերով, ապա Alpine-ն ինքնին փոքր է և հավանաբար կհամապատասխանի ձեզ:
Անցրված պատկերներ
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