ساختن ایمیج های داکری به کمک BuildKit - بخش اول

خب چند سالی هست که داکر راه خوبان رو داره میره و با تعریف پروژه موبی قدم بزرگی تو پشرفت کانتینر سازی (که البته به اشتباه معمولا میگیم داکر سازی و چه اشتباه خوبی ) برداشته.

 

 

یکی از زیر پروژه های موبی که اتفاقا بحث اصلی این پست و پست های آتی هست BuildKit نام داره که در واقع ابزاری برای ساخت ایمیج هست که در ابتدا به صورت مجزا قابل استفاده بود(و البته هنوزم هست) و از داکر ورژن 18.09 به صورت داخلی به داکر اضافه شده.

 

برای استفاده از این بیلدر یا میتونیم متغییر محیطی بنام DOCKER_BUILDKIT رو مقدار دهی کنیم و یا daemon.json رو ویرایش کنیم 

export DOCKER_BUILDKIT=1
OR 
vi /etc/docker/daemon.json 
{ "features": { "buildkit": true } 
systemctl daemon-reload
systemctl restart docker  
 
بعد از تغییر بیلدر پیش فرض داکر خروجی بیلدر هنگام ساخت ایمیج به شکل زیر میشه 
 

نکته : من برای راحتی برای دستور docker دگرنام(alias) dcr رو انتخاب کردم.

در این پست و پست های آتی به برسی قابلیت های مهم BuildKit میپردازیم

 

پردازش موازی

شاید یکی از مهمترین قابلیت های BuildKit پردازش موازی مراحل ساخت یک ایمیج باشه کاری که BuildKit انجام میده در داکرفایل های که به صورت multi-stage نوشته شدن براساس گراف وابستگی که میسازه در صورت اینکه تقدم و تاخر هر stage تاثیری روی همدیگه نداشته باشن مراحل هر stage رو به صورت موازی انجام میده.

 برای نمونه داکرفایل فرضی زیر قراره خروجی 2 پروژه جاوا ی رو روی یک ایمج alpine کپی کنه.

FROM alpine as build-stage-1
RUN echo 'build project 1' > /tmp/project1-artifact.jar
RUN sleep 5

FROM alpine as build-stage-2
RUN echo 'build project 2' > /tmp/project2-artifact.jar
RUN sleep 5


FROM alpine as final-stage
COPY --from=build-stage-1 /tmp/project1-artifact.jar .
COPY --from=build-stage-2 /tmp/project2-artifact.jar .

و نتیجه اجرا با روش قدیمی که طبعا هر استیج به صورت پی در پی انجام میشه 


و اجرا با جایگزین کردن بیلدر پیش فرض داکر به ‌BuildKit و طبعا(در صورت نداشتن وابستگی) اجرا به صورت موازی


همیشه داکرفایل به این سادگی نیست ولی وقتی داکرفایل پیچیده میشه سرعت ساخت ایمیج و در نتیجه بالا رفتن زمان اجرای پایپلاین CI/CD خیلی مهم میشه.

برای نمونه این داکرفایل ی هست که برای ساخت agent شخصی سازی شده جنکینز برای پروژه های .net ی نوشته شده بدون استفاده از buildkit تمامی این مراحل به صورت پشت سرهم باید اجرا بشه ولی همنطور که داخل عکس میبینید 4 قسمت رو میشه تحت stageهای جداگانه و به صورت موازی اجرا کرد.


ادامه دارد...


نظرات

پست‌های معروف از این وبلاگ

lnav ابزاری بسیار کاربردی برای پیمایش لاگ ها در لینوکس و البته مک

ساختن ایمیج های داکری به کمک BuildKit - بخش دوم