پست مهمان توسط عضو انجمن داکر جاستین چادل. این پست در ابتدا اینجا ظاهر شد.

چند هفته پیش ، ابزار BuildKit Docker's برای ساخت Dockerfiles اکنون از نحو heredoc پشتیبانی می کند! با این پیشرفت های جدید ، ما می توانیم همه کارهایی را که قبلاً دشوار بود انجام دهیم ، مانند چند خطی RUN s بدون بدون نیاز به تمام عکس های مزاحم مزاحم در انتهای هر خط ، یا ایجاد فایل های پیکربندی خطی کوچک.

در این پست ، من اصول اولیه این وراثت را توضیح می دهم ، و مهمتر از همه اینکه برای چه چیزی می توانید از آنها استفاده کنید و چگونه با آنها شروع کنید! 🎉

BuildKit (یک تازه سازی سریع)

از گیت هاب خود BuildKit:

BuildKit یک مجموعه ابزار برای تبدیل کد منبع برای ساخت مصنوعات به شیوه ای کارآمد ، رسا و قابل تکرار است.

اساساً ، این نسل بعدی است سازنده برای تصاویر docker ، به طور دقیق از بقیه زمان اجرای docker اصلی جدا شده است. می توانید از آن برای ساختن تصاویر docker یا تصاویر برای سایر زمان های اجرا OCI استفاده کنید. می سازد ، می سازد همزمان ، و همچنین یک معماری بسیار انعطاف پذیر است که امکان توسعه آسان را فراهم می کند (من قطعاً عدالت را رعایت نمی کنم).

شما یا به احتمال زیاد از آن استفاده می کنید ، یا احتمالاً می خواهید بودن! می توانید با تنظیم متغیر محیط DOCKER_BUILDKIT = 1 هنگام انجام ساخت docker خود ، یا استفاده از فرمان جدید (ish) docker buildx را به صورت محلی فعال کنید.

در سطح کمی فنی تر ، buildkit امکان جابجایی آسان بین چندین "سازنده" مختلف را که می توانند محلی یا از راه دور باشند ، در خود شیطان docker ، در ظروف docker یا حتی در یک غلاف Kubernetes می دهد. سازنده خود به دو قطعه اصلی تقسیم می شود ، یک پیش نمای و یک پشتیبان: نمای جلو کد متوسط ​​سطح پایین (LLB) را تولید می کند ، که سپس توسط پشتیبان به یک تصویر تبدیل می شود.

شما می توانید LLB را برای BuildKit در نظر بگیرید.

بخشی از چیزی که buildkit را فوق العاده می کند انعطاف پذیری آن است – این اجزا کاملاً از یکدیگر جدا شده اند ، بنابراین می توانید از هرگونه نمای جلو در هر تصویری استفاده کنید. به عنوان مثال ، می توانید از پیش فرض Dockerfile پیش فرض استفاده کنید ، یا بسته های آماده خود را کامپایل کنید ، یا حتی فرمت فایل جایگزین خود مانند Mockerfile را توسعه دهید. دوباره با buildkit راه اندازی شده است. تغییر به buildkit به شما یکسری بهبودهای غیر معمول در تنظیمات ساخت شما می دهد و باید با سازنده قدیمی سازگاری کامل داشته باشد (و اگر دوست ندارید همیشه می توانید آن را تغییر دهید) ).

با نصب صحیح buildkit ، می توانید یک Dockerfile: جدید را در بالای این فایل ایجاد کنید ، ما باید یک دستورالعمل #syntax = را وارد کنیم. این دستورالعمل تجزیه کننده را مطلع می کند که از یک پیش نمای خاص استفاده کند-در این مورد ، موردی که در docker/dockerfile واقع شده است: 1.3 آزمایشگاه در Docker Hub.

# syntax = docker/ dockerfile: 1.3-labs

با این خط (که باید اولین خط باشد) ، buildkit تصویر مناسب را پیدا کرده و بارگیری می کند ، و سپس از آن برای ساخت تصویر استفاده می کند.

سپس کد زیر را مشخص می کنیم. تصویر اصلی برای ساخت (درست مانند معمول):

از اوبونتو: 20.04

با همه این موارد ، می توان از یک heredoc استفاده کرد ، دو مورد را اجرا می کند دستورات در همان RUN!

RUN << EOF

پژواک "سلام" >> /سلام [19659005] پژواک "جهان!" >> /سلام

EOF

چرا؟

حالا که وراث کار می کنند ، ممکن است این سوال برای شما پیش بیاید – چرا این همه هیاهو؟ خب ، این ویژگی تا به حال در Dockerfiles وجود نداشت.

moby/moby#34423 را برای شماره اصلی که ارث شناسان را در سال 2017 پیشنهاد کرده بود ببینید.

فرض کنید شما می خواهید تصویری بسازید که نیاز به تعداد زیادی دستورات برای راه اندازی. به عنوان مثال ، یک الگوی نسبتاً متداول در Dockerfiles شامل تمایل به روزرسانی سیستم و سپس نصب برخی وابستگی های دیگر ، یعنی به روز رسانی مناسب ، ارتقاء و نصب همه

ساده لوحانه ، ممکن است همه اینها را جداگانه قرار دهیم RUN s:

RUN apt-get update

RUN apt -get upgrade -y

RUN apt -get install -y ...

اما ، متأسفانه مانند آن بسیاری از راه حل های شهودی ، این به طور کامل آنچه را که ما می خواهیم انجام نمی دهد. مطمئناً کار می کند – اما ما برای هر RUN یک لایه جدید ایجاد می کنیم ، و تصویر ما را بسیار بزرگتر از آنچه که باید باشد (و ساختن آن بسیار بیشتر طول می کشد) می سازد.

بنابراین ، ما می توانیم این را به یک تک RUN فرمان:

RUN apt-get update &&

apt-get upgrade -y && [19659005] apt -get install -y ...

و این کاری است که امروزه اکثر Dockerfile انجام می دهند ، از تصاویر داکر رسمی تا عکس های به هم ریخته ای که برای آنها نوشته ام خودم. خوب کار می کند ، تصاویر کوچک و سریع ساخته می شوند … اما کمی زشت به نظر می رسد. و اگر به طور تصادفی نماد ادامه خط را فراموش کردید ، خوب ، خطای نحوی دریافت خواهید کرد!

Heredocs گام بعدی برای بهبود این است! اکنون ، فقط می توانیم بنویسیم:

RUN << EOF

apt-get update

apt-get upgrade- y

apt -get install -y ...

EOF

ما از << EOF برای معرفی heredoc (درست مانند sh/bash/zsh/پوسته دلخواه شما) ، و EOF در انتها برای بستن آن. در بین این موارد ، ما تمام دستورات خود را به عنوان محتوای اسکریپت خود قرار می دهیم تا توسط پوسته اجرا شود!

راه های بیشتری برای اجرا …

تا کنون ، نحوی اساسی را مشاهده کرده ایم. با این حال ، پشتیبانی جدید heredoc فقط نمونه های ساده را مجاز نمی داند ، بسیاری از کارهای سرگرم کننده دیگر نیز وجود دارد که می توانید انجام دهید.

برای کامل بودن ، مثال جهان سلام با استفاده از همان نحوی که قبلاً دیده بودیم:

RUN << EOF

اکو "سلام" >> /سلام

پژواک "جهان!" >> /سلام

EOF

اما فرض کنید اسکریپت های راه اندازی شما پیچیده تر می شوند و شما می خواهید از زبان دیگری استفاده کنید – مثلاً مانند پایتون. خوب ، مشکلی نیست ، می توانید وراثت را به برنامه های دیگر متصل کنید! ) به عنوان f:

چاپ ("سلام" ، فایل = f)

چاپ ("جهان" ، فایل = f)

EOF

در واقع ، شما می توانید از دستورات پیچیده ای که دوست دارید استفاده کنید و موارد فوق را ساده کنید:

RUN python3 < /سلام

چاپ ("سلام")

چاپ ("جهان")

EOF

اگر اینطور به نظر می رسد کمی مبهم یا پیچیده ، همچنین می توانید همیشه از یک shebang استفاده کنید:

RUN << EOF

#!/usr/bin/ env python3

با باز ("/سلام" ، "w") به عنوان f:

print ("Hello"، file = f) [19659005] print ("World"، file = f)

EOF

روشهای مختلفی برای اتصال وراثت به RUN وجود دارد ، و امیدوارم راهها و پیشرفتهای بیشتری در راه باشد آینده!

… و کمی سرگرم کننده فایل!

Heredocs در Dockerfile همچنین به ما اجازه می دهند با فایلهای خطی سر و کار داشته باشیم! فرض کنید شما در حال ایجاد یک سایت nginx هستید و می خواهید یک صفحه فهرست سفارشی ایجاد کنید:

FROM nginx

COPY index .html/usr/share/nginx/html

و سپس در یک فایل جداگانه index.html ، محتوای خود را قرار دهید. اما اگر صفحه فهرست شما واقعاً ساده باشد ، ناامید کننده است که مجبور باشید همه چیز را از هم جدا کنید: افراد ارثی به شما اجازه می دهند در صورت تمایل همه چیز را در یک مکان نگه دارید!

از nginx

COPY << EOF /usr/share/nginx/html/index.html

(صفحه فهرست شما به اینجا می رود)

EOF

حتی می توانید چندین فایل را به طور همزمان ، در یک لایه کپی کنید:

کپی << robots.txt << human.txt/usr/share/nginx/html/

(محتوای روبات ها)

robots.txt

(محتوای انسان)

انسان. txt

در حال اتمام

امیدوارم ، من توانسته ام شما را متقاعد کنم که تا زمانی که می توانید امتحان کنید. در حال حاضر ، آنها هنوز فقط در نمای صحنه حضور دارند ، اما باید به زودی راه خود را برای انتشار بسیار پیش ببرند – بنابراین حتماً نگاهی بیندازید و نظرات خود را ارائه دهید! اگر علاقه دارید ، می توانید از راهنمای نحوی رسمی buildkit Dockerfile اطلاعات بیشتری کسب کنید.