Ti imaj Docker ki te kwè nan tèt yo*

[referans nan istwa fe timoun Ameriken yo "The Little Engine That Could" - approx. liy]*

Ti imaj Docker ki te kwè nan tèt yo*

Ki jan yo kreye otomatikman ti imaj Docker pou bezwen ou yo

Obsesyon etranj

Pou de mwa ki sot pase yo, mwen te obsede ak ki jan ti yon imaj Docker ka gen epi toujou gen aplikasyon an ap kouri?

Mwen konprann, lide a se etranj.

Anvan mwen antre nan detay yo ak teknik yo, mwen ta renmen eksplike poukisa pwoblèm sa a deranje m 'tankou, ak ki jan li konsène ou.

Poukisa gwosè enpòtan

Lè nou redwi sa ki nan imaj Docker la, nou diminye lis frajilite yo. Anplis de sa, nou fè imaj yo pi pwòp, paske yo genyen sèlman sa ki nesesè pou kouri aplikasyon yo.

Gen yon lòt ti avantaj - imaj yo telechaje yon ti kras pi vit, men, nan opinyon mwen, sa a pa tèlman enpòtan.

Tanpri sonje: Si w gen enkyetid sou gwosè, Alpine yo sanble tèt yo piti epi yo pral gen anpil chans anfòm ou.

Distroless imaj

Pwojè Distroless ofri yon seleksyon de baz "distroless" imaj, yo pa gen administratè pake, kokiy ak lòt sèvis piblik ke ou abitye wè sou liy lòd la. Kòm yon rezilta, sèvi ak administratè pake tankou pip и apt pa pral travay:

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

Dockerfile lè l sèvi avèk Python 3 distroless imaj

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 pa nan imaj la

Anjeneral pwoblèm sa a rezoud pa yon bati plizyè etap:

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/

Asanble milti-etap

Rezilta a se yon imaj de 130MB nan gwosè. Pa twò mal! Pou konparezon: imaj Python defo a peze 929MB, ak youn nan "pi mens" (3,7-slim) - 179MB, imaj alpine (3,7-alpine) se 98,6MB, pandan y ap imaj debaz distroless yo itilize nan egzanp lan se 50,9MB.

Li jis pou fè remake ke nan egzanp anvan an nou ap kopye yon anyè tout antye /usr/local/lib/python3.7/site-packages, ki ka genyen depandans ke nou pa bezwen. Malgre ke li klè ke diferans lan gwosè nan tout imaj baz Python ki egziste deja varye.

Nan moman sa a, Google distroless pa sipòte anpil imaj: Java ak Python yo toujou nan etap eksperimantal la, ak Python sèlman egziste pou 2,7 ak 3,5.

Ti imaj

Retounen nan mani mwen ak kreye ti imaj.

An jeneral, mwen te vle wè ki jan imaj distroless yo konstwi. Pwojè distroless a sèvi ak zouti konstriksyon Google la bazel. Sepandan, enstale Bazel ak ekri pwòp imaj ou te pran anpil travay (epi yo dwe onèt, reenvante wou a se plezi ak edikasyon). Mwen te vle senplifye kreyasyon an pi piti imaj: zak la nan kreye yon imaj ta dwe trè senp, ordinèr. Pou pa gen okenn dosye konfigirasyon pou ou, jis yon liy nan konsole a: просто собрать образ для <приложение>.

Se konsa, si ou vle kreye pwòp imaj ou, Lè sa a, konnen: gen tankou yon imaj docker inik, scratch. Scratch se yon imaj "vid", pa gen okenn dosye ladan l, byenke li peze pa default - wow! - 77 octets.

FROM scratch

Grate imaj

Lide a nan yon imaj grafouyen se ke ou ka kopye nenpòt depandans nan machin lame a nan li epi swa itilize yo andedan yon Dockerfile (sa a se tankou kopye yo nan apt epi enstale nan grafouyen), oswa pita lè imaj la Docker konkretize. Sa a pèmèt ou konplètman kontwole sa ki nan veso a Docker, epi konsa konplètman kontwole gwosè a nan imaj la.

Koulye a, nou bezwen yon jan kanmenm kolekte depandans sa yo. Zouti ki deja egziste tankou apt pèmèt ou telechaje pakè, men yo mare nan machin aktyèl la epi, apre tout, pa sipòte Windows oswa MacOS.

Se konsa, mwen mete soti nan bati pwòp zouti mwen an ki ta otomatikman bati yon imaj de baz nan gwosè ki pi piti posib epi tou kouri nenpòt aplikasyon. Mwen te itilize pakè Ubuntu/Debian, mwen te fè yon seleksyon (jwenn pakè dirèkteman nan depo yo) epi mwen te jwenn depandans yo. Pwogram nan te sipoze otomatikman telechaje dènye vèsyon ki estab nan pake a, minimize risk sekirite yo otank posib.

Mwen te nonmen zouti a fetchy, paske li... jwenn epi pote... sa ki nesesè [soti nan angle "chache", "pote" - approx. liy]. Zouti a travay atravè yon koòdone liy lòd, men an menm tan an ofri yon API.

Pou rasanble yon imaj lè l sèvi avèk fetchy (Ann pran yon imaj Python fwa sa a), ou jis bezwen sèvi ak CLI a tankou sa a: fetchy dockerize python. Ou ka mande pou sistèm operasyon sib la ak codename paske fetchy kounye a sèlman itilize pakè ki baze sou Debian ak Ubuntu.

Koulye a, ou ka chwazi ki depandans yo pa bezwen ditou (nan kontèks nou an) epi eskli yo. Pou egzanp, Python depann de perl, byenke li travay byen san yo pa enstale Perl.

Jwenn

Imaj Python kreye lè l sèvi avèk kòmandman an fetchy dockerize python3.5 peze sèlman 35MB (mwen plis pase asire w ke nan lavni an li ka fè menm pi lejè). Li sanble ke nou jere koupe yon lòt 15 WW nan imaj la distroless.

Ou ka wè tout imaj yo kolekte jiskaprezan isit la.

Pwojè - isit la.

Si w manke karakteristik, jis kreye yon demann - mwen pral kontan ede :) Menm plis, kounye a mwen ap travay sou entegre lòt manadjè pake nan fetchy, pou pa gen okenn bezwen pou bati plizyè etap.

Sous: www.habr.com

Add nouvo kòmantè