Picha ndogo za Docker ambazo zilijiamini zenyewe*

[rejea hadithi ya watoto wa Marekani "Injini Kidogo Inayoweza" - takriban. njia]*

Picha ndogo za Docker ambazo zilijiamini zenyewe*

Jinsi ya kuunda kiotomati picha ndogo za Docker kwa mahitaji yako

Obsession Isiyo ya Kawaida

Kwa miezi michache iliyopita, nimekuwa nikizingatia jinsi picha ya Docker inaweza kuwa ndogo na bado programu inafanya kazi?

Ninaelewa, wazo ni la kushangaza.

Kabla sijaingia katika maelezo na ufundi, ningependa kueleza kwa nini tatizo hili lilinisumbua sana, na jinsi linakuhusu.

Kwa nini ukubwa ni muhimu

Kwa kupunguza yaliyomo kwenye picha ya Docker, kwa hivyo tunapunguza orodha ya udhaifu. Zaidi ya hayo, tunafanya picha kuwa safi, kwa sababu zina vyenye tu vinavyohitajika ili kuendesha programu.

Kuna faida moja ndogo zaidi - picha zinapakuliwa kwa kasi kidogo, lakini, kwa maoni yangu, hii sio muhimu sana.

Tafadhali kumbuka: Ikiwa unajali kuhusu ukubwa, Alpine inaonekana yenyewe ni ndogo na inaweza kukufaa.

Picha zisizo na uharibifu

Project Distroless inatoa uteuzi wa picha za kimsingi "zisizo na uharibifu", hazina wasimamizi wa vifurushi, makombora na huduma zingine ambazo umezoea kuona kwenye safu ya amri. Kama matokeo, tumia wasimamizi wa vifurushi kama pip ΠΈ apt haitafanya kazi:

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

Dockerfile kwa kutumia Python 3 distroless picha

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

Pip haipo kwenye picha

Kawaida shida hii hutatuliwa na ujenzi wa hatua nyingi:

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/

Mkutano wa hatua nyingi

Matokeo yake ni picha ya 130MB kwa ukubwa. Sio mbaya sana! Kwa kulinganisha: picha chaguo-msingi ya Python ina uzito wa 929MB, na ile "nyembamba" (3,7-slim) - 179MB, picha ya alpine (3,7-alpine) ni 98,6MB, ilhali picha ya msingi ya distroless iliyotumika katika mfano ni 50,9MB.

Ni sawa kusema kwamba katika mfano uliopita tunanakili saraka nzima /usr/local/lib/python3.7/site-packages, ambayo inaweza kuwa na vitegemezi ambavyo hatuhitaji. Ingawa ni wazi kuwa tofauti ya saizi ya picha zote za msingi za Python inatofautiana.

Wakati wa kuandika, Google distroless haitumii picha nyingi: Java na Python bado ziko katika hatua ya majaribio, na Python ipo tu kwa 2,7 na 3,5.

Picha ndogo

Rudi kwenye shauku yangu ya kuunda picha ndogo.

Kwa ujumla, nilitaka kuona jinsi picha zisizo na uharibifu zinaundwa. Mradi usio na uharibifu hutumia zana ya ujenzi ya Google bazel. Hata hivyo, kusakinisha Bazel na kuandika picha zako mwenyewe kulichukua kazi nyingi (na kuwa waaminifu, kurejesha gurudumu ni jambo la kufurahisha na la kuelimisha). Nilitaka kurahisisha uundaji wa picha ndogo: kitendo cha kuunda picha kinapaswa kuwa rahisi sana, banal. Ili hakuna faili za usanidi kwako, mstari mmoja tu kwenye koni: просто ΡΠΎΠ±Ρ€Π°Ρ‚ΡŒ ΠΎΠ±Ρ€Π°Π· для <ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅>.

Kwa hivyo, ikiwa unataka kuunda picha zako mwenyewe, basi ujue: kuna picha ya kipekee ya docker, scratch. Mkwaruzo ni picha "tupu", hakuna faili ndani yake, ingawa ina uzani kwa chaguo-msingi - wow! - 77 ka.

FROM scratch

Piga picha

Wazo la picha ya mwanzo ni kwamba unaweza kunakili utegemezi wowote kutoka kwa mashine mwenyeji ndani yake na ama utumie ndani ya Dockerfile (hii ni kama kunakili kwa apt na usakinishe kutoka mwanzo), au baadaye wakati picha ya Docker imeundwa. Hii inakuwezesha kudhibiti kabisa yaliyomo kwenye chombo cha Docker, na hivyo kudhibiti kabisa ukubwa wa picha.

Sasa tunahitaji kwa namna fulani kukusanya tegemezi hizi. Zana zilizopo kama apt kuruhusu kupakua vifurushi, lakini zimefungwa kwenye mashine ya sasa na, baada ya yote, haziunga mkono Windows au MacOS.

Kwa hivyo niliamua kuunda zana yangu mwenyewe ambayo ingeunda kiotomati picha ya msingi ya saizi ndogo kabisa na pia kuendesha programu yoyote. Nilitumia vifurushi vya Ubuntu/Debian, nikafanya uteuzi (kupata vifurushi moja kwa moja kutoka kwa hazina) na nikapata utegemezi wao. Mpango huo ulitakiwa kupakua kiotomatiki toleo la hivi punde thabiti la kifurushi, na kupunguza hatari za usalama iwezekanavyo.

Niliita chombo hicho fetchy, kwa sababu yeye... hupata na kuleta... kinachohitajika [kutoka kwa Kiingereza "chota", "leta" - takriban. njia]. Chombo hufanya kazi kwa njia ya interface ya mstari wa amri, lakini wakati huo huo hutoa API.

Kukusanya picha kwa kutumia fetchy (wacha tuchukue picha ya Python wakati huu), unahitaji tu kutumia CLI kama hii: fetchy dockerize python. Unaweza kuulizwa mfumo wa uendeshaji unaolengwa na jina la msimbo kwa sababu fetchy kwa sasa hutumia tu vifurushi kulingana na Debian na Ubuntu.

Sasa unaweza kuchagua ni utegemezi gani hauhitajiki kabisa (katika muktadha wetu) na uwatenge. Kwa mfano, Python inategemea perl, ingawa inafanya kazi vizuri bila Perl kusanikishwa.

Matokeo

Picha ya Python iliyoundwa kwa kutumia amri fetchy dockerize python3.5 uzani wa 35MB tu (nina uhakika zaidi kwamba katika siku zijazo inaweza kufanywa kuwa nyepesi zaidi). Inabadilika kuwa tuliweza kunyoa WW nyingine 15 kutoka kwa picha isiyo na uharibifu.

Unaweza kuona picha zote zilizokusanywa hadi sasa hapa.

Mradi - hapa.

Ikiwa unakosa vipengele, tengeneza ombi tu - nitafurahi kusaidia :) Hata zaidi, sasa ninafanya kazi ya kuunganisha wasimamizi wengine wa vifurushi kwenye fetchy, ili hakuna haja ya kujenga hatua nyingi.

Chanzo: mapenzi.com

Kuongeza maoni