Өөртөө итгэсэн бяцхан Докерын зургууд*

[Америкийн хүүхдийн үлгэрийн "The Little Engine That Could"-ийн лавлагаа - ойролцоогоор. эгнээ]*

Өөртөө итгэсэн бяцхан Докерын зургууд*

Хэрхэн өөрийн хэрэгцээнд зориулж жижиг Docker зургуудыг автоматаар үүсгэх вэ

Ер бусын хүсэл тэмүүлэл

Сүүлийн хоёр сарын турш би Docker-ийн зураг хэр жижиг байж болох ч энэ програмыг ажиллуулсаар байх уу?

Би ойлгож байна, санаа нь хачирхалтай.

Нарийвчилсан мэдээлэл, техникийн талаар ярихаасаа өмнө энэ асуудал яагаад намайг маш их зовоож байгааг, мөн энэ нь танд хэрхэн хамаатайг тайлбарлахыг хүсч байна.

Хэмжээ яагаад чухал вэ

Docker зургийн агуулгыг багасгаснаар бид эмзэг байдлын жагсаалтыг багасгадаг. Нэмж дурдахад бид зургуудыг илүү цэвэрхэн болгодог, учир нь тэдгээр нь зөвхөн програмуудыг ажиллуулахад шаардлагатай зүйлсийг агуулдаг.

Өөр нэг жижиг давуу тал бий - зургийг арай хурдан татаж авдаг, гэхдээ миний бодлоор энэ нь тийм ч чухал биш юм.

Анхаарна уу: Хэрэв та хэмжээндээ санаа зовж байгаа бол Альпийн харагдац нь жижиг бөгөөд танд тохирох болно.

Дистролгүй зургууд

Дистролес төсөл Үндсэн "дистролгүй" зургуудын сонголтыг санал болгодог бөгөөд тэдгээр нь таны тушаалын мөрөнд харж дассан багц менежер, бүрхүүл болон бусад хэрэгслийг агуулаагүй болно. Үүний үр дүнд багц менежерүүдийг ашиглана уу pip и apt ажиллахгүй болно:

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

Python 3 дистролгүй дүрсийг ашиглан Dockerfile

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/

Олон үе шаттай угсралт

Үр дүн нь 130MB хэмжээтэй зураг юм. Тийм ч муу биш! Харьцуулбал: өгөгдмөл Python зураг нь 929MB жинтэй, харин "нимгэн" нь (3,7-slim) - 179MB, уулын зураг (3,7-alpine) нь 98,6MB, харин жишээнд ашигласан үндсэн тархалтгүй дүрс нь 50,9MB юм.

Өмнөх жишээн дээр бид бүхэл бүтэн лавлахыг хуулж байгааг онцлон тэмдэглэх нь зүйтэй /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

Зураасан зураг

Зураасан зургийн санаа нь та хост машинаас ямар ч хамаарлыг хуулж аваад 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 програмд ​​нэгтгэхээр ажиллаж байгаа бөгөөд ингэснээр олон үе шаттай бүтээх шаардлагагүй болно.

Эх сурвалж: www.habr.com

сэтгэгдэл нэмэх