Mga maliliit na larawan ng Docker na naniniwala sa kanilang sarili*

[reference sa American children's fairy tale "The Little Engine That Could" - approx. lane]*

Mga maliliit na larawan ng Docker na naniniwala sa kanilang sarili*

Paano awtomatikong lumikha ng maliliit na larawan ng Docker para sa iyong mga pangangailangan

Hindi Pangkaraniwang Pagkahumaling

Sa nakalipas na ilang buwan, nahuhumaling ako sa kung gaano kaliit ang isang imahe ng Docker at gumagana pa rin ang application?

Naiintindihan ko, kakaiba ang ideya.

Bago ko talakayin ang mga detalye at teknikalidad, nais kong ipaliwanag kung bakit labis akong naabala ng problemang ito, at kung paano ito nababahala sa iyo.

Bakit mahalaga ang sukat

Sa pamamagitan ng pagbabawas ng mga nilalaman ng imahe ng Docker, sa gayon ay binabawasan namin ang listahan ng mga kahinaan. Bukod pa rito, ginagawa naming mas malinis ang mga larawan, dahil naglalaman lamang ang mga ito ng kung ano ang kinakailangan upang magpatakbo ng mga application.

Mayroong isa pang maliit na kalamangan - ang mga imahe ay nai-download nang kaunti nang mas mabilis, ngunit, sa palagay ko, hindi ito napakahalaga.

Pakitandaan: Kung nag-aalala ka tungkol sa laki, mukhang maliit ang Alpine at malamang na magkasya sa iyo.

Mga distroless na imahe

Project Distroless nag-aalok ng seleksyon ng mga pangunahing "distroless" na mga imahe, hindi naglalaman ang mga ito ng mga manager ng package, shell at iba pang mga utility na nakasanayan mong makita sa command line. Bilang isang resulta, gumamit ng mga manager ng package tulad ng pip ΠΈ apt ayaw gumana:

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

Dockerfile gamit ang Python 3 distroless na imahe

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

Wala si Pip sa larawan

Karaniwan ang problemang ito ay nalutas sa pamamagitan ng isang multi-stage build:

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/

Multi-stage na pagpupulong

Ang resulta ay isang imahe na 130MB ang laki. Hindi masyadong masama! Para sa paghahambing: ang default na imahe ng Python ay tumitimbang ng 929MB, at ang "mas payat" (3,7-slim) - 179MB, alpine image (3,7-alpine) ay 98,6MB, habang ang batayang distroless na imahe na ginamit sa halimbawa ay 50,9MB.

Makatarungang ituro na sa nakaraang halimbawa ay kinokopya namin ang isang buong direktoryo /usr/local/lib/python3.7/site-packages, na maaaring naglalaman ng mga dependency na hindi namin kailangan. Bagaman malinaw na ang pagkakaiba ng laki ng lahat ng umiiral na mga imahe ng base ng Python ay nag-iiba.

Sa oras ng pagsulat, ang Google distroless ay hindi sumusuporta sa maraming mga imahe: Java at Python ay nasa pang-eksperimentong yugto pa rin, at ang Python ay umiiral lamang para sa 2,7 at 3,5.

Mga maliliit na larawan

Bumalik sa aking pagkahumaling sa paglikha ng maliliit na larawan.

Sa pangkalahatan, gusto kong makita kung paano nabuo ang mga distroless na imahe. Ang distroless na proyekto ay gumagamit ng build tool ng Google bazel. Gayunpaman, ang pag-install ng Bazel at pagsusulat ng sarili mong mga larawan ay kinailangan ng maraming trabaho (at sa totoo lang, ang muling pag-imbento ng gulong ay masaya at nakapagtuturo). Nais kong gawing simple ang paglikha ng mas maliliit na larawan: ang pagkilos ng paglikha ng isang imahe ay dapat na napakasimple, karaniwan. Para walang configuration file para sa iyo, isang linya lang sa console: просто ΡΠΎΠ±Ρ€Π°Ρ‚ΡŒ ΠΎΠ±Ρ€Π°Π· для <ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅>.

Kaya, kung nais mong lumikha ng iyong sariling mga imahe, pagkatapos ay alamin: mayroong isang kakaibang imahe ng docker, scratch. Ang scratch ay isang "walang laman" na imahe, walang mga file sa loob nito, bagaman ito ay tumitimbang bilang default - wow! - 77 byte.

FROM scratch

scratch image

Ang ideya ng scratch image ay maaari mong kopyahin ang anumang dependencies mula sa host machine papunta dito at gamitin ang mga ito sa loob ng Dockerfile (ito ay tulad ng pagkopya sa kanila sa apt at i-install mula sa simula), o mas bago kapag ang imahe ng Docker ay na-materialize. Binibigyang-daan ka nitong ganap na kontrolin ang mga nilalaman ng lalagyan ng Docker, at sa gayon ay ganap na kontrolin ang laki ng larawan.

Ngayon kailangan nating kolektahin ang mga dependency na ito. Mga umiiral na tool tulad ng apt pinapayagan kang mag-download ng mga pakete, ngunit nakatali ang mga ito sa kasalukuyang makina at, pagkatapos ng lahat, hindi sumusuporta sa Windows o MacOS.

Kaya't nagtakda akong bumuo ng sarili kong tool na awtomatikong bubuo ng base na imahe ng pinakamaliit na posibleng laki at magpapatakbo din ng anumang application. Gumamit ako ng mga pakete ng Ubuntu/Debian, gumawa ng isang seleksyon (pagkuha ng mga pakete nang direkta mula sa mga repositoryo) at recursively natagpuan ang kanilang mga dependencies. Ang programa ay dapat na awtomatikong i-download ang pinakabagong matatag na bersyon ng package, na pinapaliit ang mga panganib sa seguridad hangga't maaari.

Pinangalanan ko ang tool fetchy, dahil siya... hinahanap at dinadala... kung ano ang kailangan [mula sa Ingles β€œkunin”, β€œdalhin” - tinatayang. lane]. Gumagana ang tool sa pamamagitan ng interface ng command line, ngunit sa parehong oras ay nag-aalok ng API.

Upang mag-ipon ng isang imahe gamit ang fetchy (kumuha tayo ng isang imahe ng Python sa oras na ito), kailangan mo lamang gamitin ang CLI tulad nito: fetchy dockerize python. Maaaring hilingin sa iyo ang target na operating system at codename dahil fetchy kasalukuyang gumagamit lamang ng mga pakete batay sa Debian at Ubuntu.

Ngayon ay maaari mong piliin kung aling mga dependency ang hindi kailangan (sa aming konteksto) at ibukod ang mga ito. Halimbawa, ang Python ay nakasalalay sa perl, bagaman ito ay gumagana nang maayos nang walang Perl na naka-install.

Natuklasan

Ang imahe ng Python ay nilikha gamit ang command fetchy dockerize python3.5 weighs only 35MB (I am more than sure that in the future maari itong gawing mas magaan). Lumalabas na nagawa naming mag-ahit ng isa pang 15 WW mula sa distroless na imahe.

Maaari mong makita ang lahat ng mga imahe na nakolekta sa ngayon dito.

Proyekto - dito.

Kung kulang ka ng mga feature, gumawa lang ng kahilingan - Ikalulugod kong tumulong :) Higit pa rito, kasalukuyan akong nagsusumikap sa pagsasama ng iba pang mga manager ng package sa fetchy, nang sa gayon ay hindi na kailangan ng multi-stage na mga build.

Pinagmulan: www.habr.com

Magdagdag ng komento