Ang gagmay nga mga imahe sa Docker nga nagtuo sa ilang kaugalingon *

[paghisgot sa sugilanon sa mga bata nga Amerikano nga "Ang Gamay nga Makina nga Mahimo" - gibanabana. lane]*

Ang gagmay nga mga imahe sa Docker nga nagtuo sa ilang kaugalingon *

Giunsa ang awtomatikong paghimo og gagmay nga mga imahe sa Docker alang sa imong mga panginahanglan

Talagsaon nga Obsession

Sa miaging duha ka bulan, nahingangha ko kung unsa ka gamay ang usa ka imahe sa Docker ug adunay gihapon ang aplikasyon nga nagdagan?

Nakasabot ko, katingad-an ang ideya.

Sa dili pa ako moadto sa mga detalye ug teknikalidad, gusto nako ipasabut kung ngano nga kini nga problema nakahasol kaayo kanako, ug kung giunsa kini nagpakabana kanimo.

Nganong importante ang gidak-on

Pinaagi sa pagkunhod sa mga sulud sa imahe sa Docker, sa ingon gipakunhuran namon ang lista sa mga kahuyangan. Dugang pa, gihimo namon ang mga imahe nga labi ka limpyo, tungod kay kini adunay lamang kung unsa ang gikinahanglan aron makadagan ang mga aplikasyon.

Adunay usa pa ka gamay nga bentaha - ang mga imahe gi-download nga mas paspas, apan, sa akong opinyon, dili kini hinungdanon.

Palihug timan-i: Kung nabalaka ka bahin sa gidak-on, ang Alpine nagtan-aw sa ilang kaugalingon nga gamay ug lagmit mohaum kanimo.

Distroless nga mga imahe

Project Distroless nagtanyag og usa ka pagpili sa mga batakang "distroless" nga mga hulagway, wala sila'y sulod nga mga managers sa package, shells ug uban pang mga utilities nga naandan nimo nga makita sa command line. Ingon usa ka sangputanan, gamita ang mga managers sa package sama sa pip и apt dili molihok:

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

Dockerfile gamit ang Python 3 distroless nga 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

Ang Pip wala sa imahe

Kasagaran kini nga problema masulbad pinaagi sa usa ka multi-stage nga pagtukod:

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 nga asembliya

Ang resulta usa ka imahe nga 130MB ang gidak-on. Dili kaayo daotan! Alang sa pagtandi: ang default nga imahe sa Python adunay gibug-aton nga 929MB, ug ang "nipis" (3,7-slim) - 179MB, alpine nga hulagway (3,7-alpine) mao ang 98,6MB, samtang ang base nga distroless nga imahe nga gigamit sa pananglitan mao ang 50,9MB.

Makatarunganon nga ipunting nga sa miaging pananglitan kita nagkopya sa usa ka tibuuk nga direktoryo /usr/local/lib/python3.7/site-packages, nga mahimong adunay mga dependency nga wala namo kinahanglana. Bisan kung kini klaro nga ang kalainan sa gidak-on sa tanan nga mga naglungtad nga mga imahe sa base sa Python magkalainlain.

Sa panahon sa pagsulat, ang Google distroless wala nagsuporta sa daghang mga imahe: Ang Java ug Python anaa pa sa yugto sa eksperimento, ug ang Python anaa lamang sa 2,7 ug 3,5.

Gagmay nga mga hulagway

Balik sa akong obsession sa paghimo og gagmay nga mga hulagway.

Sa kinatibuk-an, gusto nako nga tan-awon kung giunsa ang paghimo sa mga distroless nga mga imahe. Ang distroless nga proyekto naggamit sa Google's build tool bazel. Bisan pa, ang pag-instalar sa Bazel ug pagsulat sa imong kaugalingon nga mga imahe nagkinahanglag daghang trabaho (ug sa tinuud, ang pag-imbento pag-usab sa ligid makalingaw ug edukasyon). Gusto nako nga pasimplehon ang paghimo sa gagmay nga mga imahe: ang buhat sa paghimo og imahe kinahanglan nga labi ka yano, balaan. Aron walay mga configuration file alang kanimo, usa lang ka linya sa console: просто собрать образ для <приложение>.

Mao nga, kung gusto nimo maghimo sa imong kaugalingon nga mga imahe, nan hibal-i: adunay usa ka talagsaon nga imahe sa docker, scratch. Ang Scratch usa ka "walay sulod" nga imahe, wala’y mga file niini, bisan kung kini nagtimbang sa default - wow! - 77 ka byte.

FROM scratch

Scratch nga hulagway

Ang ideya sa usa ka scratch image mao nga mahimo nimong kopyahon ang bisan unsang dependency gikan sa host machine ngadto niini ug gamiton kini sulod sa Dockerfile (kini sama sa pagkopya niini ngadto sa apt ug i-install gikan sa wala), o sa ulahi kung ang imahe sa Docker nahimo. Gitugotan ka niini nga hingpit nga makontrol ang sulud sa sulud sa Docker, ug sa ingon hingpit nga makontrol ang gidak-on sa imahe.

Karon kinahanglan namong kolektahon kini nga mga dependency. Ang kasamtangan nga mga himan sama sa apt nagtugot kanimo sa pag-download sa mga pakete, apan sila nahigot sa kasamtangan nga makina ug, human sa tanan, dili pagsuporta sa Windows o MacOS.

Mao nga nagsugod ako sa paghimo sa akong kaugalingon nga himan nga awtomatiko nga maghimo usa ka base nga imahe sa labing gamay nga posible nga gidak-on ug magpadagan usab sa bisan unsang aplikasyon. Gigamit nako ang mga pakete sa Ubuntu/Debian, naghimo og usa ka pagpili (pagkuha og mga pakete direkta gikan sa mga repositoryo) ug recursively nakit-an ang ilang mga dependency. Ang programa kinahanglan nga awtomatikong mag-download sa pinakabag-o nga stable nga bersyon sa package, nga makunhuran ang mga risgo sa seguridad kutob sa mahimo.

Ginganlan nako ang himan fetchy, kay siya... nakakaplag ug nagdala... sa gikinahanglan [gikan sa English "kuhaa", "pagdala" - gibanabana. lane]. Ang himan nagtrabaho pinaagi sa usa ka command line interface, apan sa samang higayon nagtanyag og API.

Sa pag-assemble og imahe gamit ang fetchy (magkuha kita ug Python image karong panahona), kinahanglan nimo nga gamiton ang CLI sama niini: fetchy dockerize python. Mahimong pangutan-on ka alang sa target nga operating system ug codename tungod kay fetchy sa pagkakaron naggamit lang og mga pakete base sa Debian ug Ubuntu.

Karon mahimo nimong pilion kung unsang mga dependency ang wala kinahanglana (sa among konteksto) ug dili iapil kini. Pananglitan, ang Python nagdepende sa perl, bisan kung kini molihok nga maayo kung wala gi-install ang Perl.

Результаты

Ang imahe sa Python gihimo gamit ang command fetchy dockerize python3.5 35MB ra ang gibug-aton (mas sigurado ko nga sa umaabot mahimo pa kini nga mas gaan). Kini nahimo nga nakahimo kami sa pag-ahit sa laing 15 WW gikan sa distroless nga imahe.

Makita nimo ang tanan nga mga imahe nga nakolekta hangtod karon dinhi.

Proyekto - dinhi.

Kung kulang ka sa mga feature, paghimo lang og request - I will be happy to help :) Labaw pa, ako sa pagkakaron nagtrabaho sa pag-integrate sa ubang mga package managers ngadto sa fetchy, para dili na kinahanglan ang multi-stage builds.

Source: www.habr.com

Idugang sa usa ka comment