این سند بهترین روشها و روشهای توصیه شده برای ساخت تصاویر کارآمد را در بر می گیرد.
Docker با خواندن دستورالعمل ها از Dockerfile به طور خودکار تصاویر را می سازد - یک فایل متنی که شامل کلیه دستورات ، به ترتیب ، برای ساختن یک تصویر معین است. Dockerfile به یک قالب خاص و مجموعه ای از دستورالعمل ها که می توانید در Dockerfile Reference پیدا کنید ، پیروی می کند.
یک تصویر Docker از لایه های فقط خواندنی تشکیل شده است که هر یک از آنها یک دستورالعمل Dockerfile را نشان می دهد. لایه ها انباشته شده اند و هر یک دلتا از تغییرات در لایه قبلی است. این dockerfile را در نظر بگیرید:
هر دستورالعمل یک لایه را ایجاد می کند:
- از یک لایه از اوبونتو ایجاد می کند: تصویر Docker 18. 04.
- کپی پرونده ها را از فهرست فعلی مشتری Docker خود اضافه می کند.
- Run برنامه خود را با MAKE می سازد.
- CMD مشخص می کند که چه دستور برای اجرای درون ظرف است.
هنگامی که یک تصویر را اجرا می کنید و یک ظرف تولید می کنید ، یک لایه قابل نوشتن جدید ("لایه کانتینر") را در بالای لایه های زیرین اضافه می کنید. تمام تغییرات ایجاد شده در کانتینر در حال اجرا ، مانند نوشتن پرونده های جدید ، اصلاح پرونده های موجود و حذف پرونده ها ، برای این لایه کانتینر قابل نوشتن نوشته شده است.
برای اطلاعات بیشتر در مورد لایه های تصویر (و نحوه ساخت و ذخیره تصاویر Docker) ، در مورد درایورهای ذخیره سازی مراجعه کنید.
دستورالعمل ها و توصیه های عمومی
ظروف زودگذر را ایجاد کنید
تصویری که توسط dockerfile شما تعریف شده است باید ظرفی ایجاد کند که تا حد امکان زودگذر باشد. با "زودگذر" ، منظور ما این است که ظرف را می توان متوقف و از بین برد ، سپس بازسازی و با حداقل تنظیم و پیکربندی مطلق جایگزین شد.
به فرآیندهای تحت روش برنامه دوازده عاملی مراجعه کنید تا احساس انگیزه های ظروف در حال اجرا را با چنین روشی بدون تابعیت بدست آورید.
زمینه ساخت را درک کنید
برای اطلاعات بیشتر به صفحه ساخت زمینه مراجعه کنید.
Dockerfile از طریق stdin
Docker توانایی ساخت تصاویر را با لوله کشی Dockerfile از طریق Stdin با زمینه ساخت محلی یا از راه دور دارد. لوله کشی یک dockerfile از طریق stdin می تواند برای انجام ساختهای یک طرفه بدون نوشتن dockerfile به دیسک یا در شرایطی که dockerfile تولید می شود مفید باشد و پس از آن نباید ادامه یابد.
مثالهای موجود در این بخش در اینجا از اسناد برای راحتی استفاده می کنند ، اما می توان از هر روشی برای تهیه Dockerfile در Stdin استفاده کرد.
به عنوان مثال ، دستورات زیر معادل هستند:
می توانید نمونه ها را با رویکرد مورد نظر خود جایگزین کنید ، یا رویکردی که به بهترین وجه متناسب با استفاده شما باشد.
بدون ارسال زمینه ساخت و ساز ، با استفاده از یک dockerfile از stdin بسازید
از این نحو برای ساختن یک تصویر با استفاده از dockerfile از stdin استفاده کنید ، بدون ارسال پرونده های اضافی به عنوان زمینه ساخت. Hyphen ( -) موقعیت مسیر را می گیرد و به Docker دستور می دهد تا زمینه ساخت (که فقط حاوی یک dockerfile است) را از stdin به جای دایرکتوری بخواند:
مثال زیر تصویری را با استفاده از dockerfile که از طریق stdin منتقل می شود ، ایجاد می کند. هیچ پرونده ای به عنوان زمینه ساخت برای Daemon ارسال نمی شود.
حذف زمینه ساخت می تواند در شرایطی مفید باشد که Dockerfile شما نیازی به کپی کردن پرونده ها در تصویر ندارد و سرعت ساخت را بهبود می بخشد ، زیرا هیچ پرونده ای به Daemon ارسال نمی شود.
اگر می خواهید با حذف برخی از پرونده ها از زمینه ساخت و ساز ، سرعت ساخت را بهبود بخشید ، به حذف با . dockerignore مراجعه کنید.
توجه: تلاش برای ساختن یک dockerfile که از کپی یا افزودن استفاده می کند ، در صورت استفاده از این نحو از بین می رود. مثال زیر این را نشان می دهد:
ساخت از یک زمینه ساخت محلی ، با استفاده از یک dockerfile از stdin
از این نحو برای ساختن یک تصویر با استفاده از پرونده ها در سیستم فایل محلی خود استفاده کنید ، اما با استفاده از Dockerfile از Stdin. نحو از گزین ه-f (ی ا-فایل) برای مشخص کردن dockerfile برای استفاده ، با استفاده از یک hyphen ( -) به عنوان نام پرونده برای راهنمایی داکر برای خواندن dockerfile از stdin استفاده می کند:
مثال زیر از دایرکتوری فعلی (.) به عنوان زمینه ساخت استفاده می کند و با استفاده از یک Dockerfile که از طریق stdin با استفاده از یک سند اینجا منتقل می شود ، تصویری می سازد.
از یک زمینه ساخت از راه دور ، با استفاده از یک dockerfile از stdin بسازید
از این نحو برای ساختن یک تصویر با استفاده از پرونده های مخزن از راه دور GIT ، با استفاده از Dockerfile از Stdin استفاده کنید. نحو از گزین ه-f (ی ا-فایل) برای مشخص کردن dockerfile برای استفاده ، با استفاده از یک hyphen ( -) به عنوان نام پرونده برای راهنمایی داکر برای خواندن dockerfile از stdin استفاده می کند:
این نحو می تواند در شرایطی که می خواهید تصویری از مخزن ایجاد کنید که حاوی یک داکرفیل نباشد ، یا اگر می خواهید با یک dockerfile سفارشی بسازید ، بدون نگه داشتن چنگال خود در مخزن ، مفید باشد.
مثال زیر تصویری را با استفاده از Dockerfile از Stdin ایجاد می کند و پرونده Hello. c را از مخزن Git "Hello-World" در GitHub اضافه می کند.
در زیر کاپوت
Docker هنگام ساختن تصویری با استفاده از یک مخزن از راه دور GIT به عنوان زمینه ساخت ، یک کلون GIT از مخزن را بر روی دستگاه محلی انجام می دهد و آن پرونده ها را به عنوان زمینه ساخت به Daemon ارسال می کند. این ویژگی نیاز به نصب بر روی میزبان دارد که در آن فرمان ساخت Docker را اجرا می کنید.
با . dockerignore حذف کنید
برای حذف پرونده هایی که به ساخت و ساز مربوط نمی شوند (بدون بازسازی مخزن منبع خود) از یک پرونده . dockerignore استفاده کنید. این پرونده از الگوهای محرومیت مشابه با پرونده های . gitignore پشتیبانی می کند. برای اطلاعات در مورد ایجاد یکی ، به پرونده . dockerignore مراجعه کنید.
از ساختهای چند مرحله ای استفاده کنید
ساخت و سازهای چند مرحله ای به شما امکان می دهد بدون اینکه سعی کنید تعداد لایه ها و پرونده های متوسط را کاهش دهید ، اندازه تصویر نهایی خود را به شدت کاهش دهید.
از آنجا که یک تصویر در مرحله آخر فرآیند ساخت ساخته شده است ، می توانید با استفاده از حافظه نهان ساخت ، لایه های تصویر را به حداقل برسانید.
به عنوان مثال ، اگر ساخت شما حاوی چندین لایه است ، می توانید آنها را از کمتر تغییر دهید (برای اطمینان از ساخت حافظه نهان ساخت) به مواردی که اغلب تغییر یافته است:
ابزارهایی را که برای ساخت برنامه خود نیاز دارید نصب کنید
وابستگی های کتابخانه را نصب یا به روز کنید
برنامه خود را تولید کنید
Dockerfile برای یک برنامه Go می تواند به نظر برسد:
بسته های غیر ضروری را نصب نکنید
برای کاهش پیچیدگی ، وابستگی ها ، اندازه پرونده ها و زمان ساخت ، از نصب بسته های اضافی یا غیر ضروری فقط به این دلیل که ممکن است "خوب بودن" باشد ، خودداری کنید. به عنوان مثال ، نیازی نیست که ویرایشگر متن را در یک تصویر پایگاه داده وارد کنید.
برنامه های جدا شده
هر ظرف فقط باید یک نگرانی داشته باشد. جدا کردن برنامه ها در چندین ظروف ، مقیاس افقی و استفاده مجدد از ظروف را آسان تر می کند. به عنوان مثال ، یک پشته برنامه وب ممکن است از سه ظروف جداگانه تشکیل شود که هر کدام دارای تصویر منحصر به فرد خود هستند تا برنامه وب ، بانک اطلاعاتی و حافظه نهان حافظه را به روشی جدا شده مدیریت کنند.
محدود کردن هر ظرف به یک فرآیند یک قاعده خوب برای شست است ، اما این یک قانون سخت و سریع نیست. به عنوان مثال ، نه تنها کانتینرها با یک فرآیند اولیه می توانند ایجاد شوند ، بلکه برخی از برنامه ها ممکن است فرآیندهای اضافی را به توافق برسند. به عنوان مثال ، کرفس می تواند چندین فرآیند کارگر را تخم ریزی کند و آپاچی می تواند در هر درخواست یک فرآیند ایجاد کند.
از بهترین قضاوت خود استفاده کنید تا ظروف را تا حد امکان تمیز و مدولار نگه دارید. اگر ظروف به یکدیگر بستگی دارند ، می توانید از شبکه های کانتینر Docker استفاده کنید تا اطمینان حاصل شود که این ظروف می توانند ارتباط برقرار کنند.
تعداد لایه ها را به حداقل برسانید
در نسخه های قدیمی تر Docker ، مهم بود که تعداد لایه ها را در تصاویر خود به حداقل برسانید تا از عملکرد آنها اطمینان حاصل شود. ویژگی های زیر برای کاهش این محدودیت اضافه شده است:
فقط دستورالعمل ها اجرا ، کپی ، اضافه کردن لایه ها. سایر دستورالعمل ها تصاویر میانی موقت را ایجاد می کنند و اندازه ساخت را افزایش نمی دهند.
در صورت امکان، از ساخت های چند مرحله ای استفاده کنید و فقط مصنوعات مورد نیاز خود را در تصویر نهایی کپی کنید. این به شما امکان می دهد ابزارها و اطلاعات اشکال زدایی را در مراحل ساخت میانی خود بدون افزایش اندازه تصویر نهایی قرار دهید.
آرگومان های چند خطی را مرتب کنید
در صورت امکان، تغییرات بعدی را با مرتبسازی آرگومانهای چند خطی به صورت الفبایی آسان کنید. این به جلوگیری از تکراری شدن بسته ها کمک می کند و به روز رسانی لیست را بسیار آسان تر می کند. این همچنین خواندن و بررسی PR را بسیار آسان تر می کند. اضافه کردن فاصله قبل از اسلش ( \ ) نیز کمک می کند.
در اینجا یک مثال از تصویر buildpack-deps آورده شده است:
اهرم کش ساخت
هنگام ساخت یک تصویر، Docker دستورالعملهای موجود در Dockerfile شما را طی میکند و هر کدام را به ترتیب مشخص شده اجرا میکند. همانطور که هر دستورالعمل بررسی می شود، داکر به جای ایجاد یک تصویر جدید (تکراری) به دنبال یک تصویر موجود در حافظه پنهان خود می گردد که بتواند دوباره از آن استفاده کند.
اگر اصلاً نمی خواهید از کش استفاده کنید، می توانید از گزینه --no-cache=true در دستور ساخت docker استفاده کنید. با این حال، اگر به Docker اجازه دهید از حافظه پنهان خود استفاده کند، مهم است که بفهمید چه زمانی میتواند یا نمیتواند یک تصویر منطبق را پیدا کند. قوانین اساسی که داکر از آنها پیروی می کند به شرح زیر است:
با شروع با یک تصویر والد که از قبل در حافظه پنهان است، دستورالعمل بعدی با تمام تصاویر فرزند مشتق شده از آن تصویر پایه مقایسه می شود تا ببیند آیا یکی از آنها دقیقاً با همان دستورالعمل ساخته شده است یا خیر. در غیر این صورت، حافظه پنهان باطل می شود.
در بیشتر موارد، مقایسه دستورات موجود در Dockerfile با یکی از تصاویر فرزند کافی است. با این حال، دستورالعمل های خاص نیاز به بررسی و توضیح بیشتری دارد.
برای دستورالعمل های ADD و COPY، محتویات فایل(های) موجود در تصویر بررسی می شود و برای هر فایل یک چک جمع محاسبه می شود. زمانهای آخرین تغییر و آخرین دسترسی به فایل(های) در این چکسامها در نظر گرفته نمیشود. در حین جستجوی کش، جمع کنترلی با جمع کنترلی موجود در تصاویر موجود مقایسه می شود. اگر چیزی در فایل(ها) تغییر کرده باشد، مانند محتویات و ابرداده ها، کش باطل می شود.
جدای از دستورات ADD و COPY، بررسی کش به فایلهای موجود در ظرف نگاه نمیکند تا تطابق حافظه پنهان را تعیین کند. به عنوان مثال، هنگام پردازش یک دستور بهروزرسانی RUN apt-ge t-y، فایلهای بهروزرسانیشده در ظرف بررسی نمیشوند تا مشخص شود آیا ضربه پنهان وجود دارد یا خیر. در این حالت فقط از خود رشته فرمان برای یافتن یک تطابق استفاده می شود.
هنگامی که کش باطل می شود، تمام دستورات بعدی Dockerfile تصاویر جدیدی تولید می کنند و از کش استفاده نمی شود.
دستورالعمل های Dockerfile
این توصیهها برای کمک به ایجاد یک Dockerfile کارآمد و قابل نگهداری طراحی شدهاند.
در صورت امکان، از تصاویر رسمی فعلی به عنوان مبنایی برای تصاویر خود استفاده کنید. ما تصویر Alpine را توصیه می کنیم زیرا به شدت کنترل می شود و اندازه آن کوچک است (در حال حاضر کمتر از 6 مگابایت)، در حالی که هنوز یک توزیع کامل لینوکس است.
برچسب
می توانید برچسب هایی را به تصویر خود اضافه کنید تا به سازماندهی تصاویر بر اساس پروژه، ثبت اطلاعات مجوز، کمک به اتوماسیون یا به دلایل دیگر کمک کند. برای هر برچسب، یک خط با LABEL و با یک یا چند جفت کلید-مقدار اضافه کنید. مثال های زیر فرمت های مختلف قابل قبول را نشان می دهد. نظرات توضیحی به صورت خطی گنجانده شده است.
رشته های دارای فاصله باید نقل قول شوند یا فاصله ها باید خارج شوند. کاراکترهای نقل قول داخلی ( ")، نیز باید حذف شوند.
یک تصویر می تواند بیش از یک برچسب داشته باشد. قبل از Docker 1. 10، توصیه می شد که همه برچسب ها را در یک دستورالعمل LABEL ترکیب کنید تا از ایجاد لایه های اضافی جلوگیری شود. این دیگر ضروری نیست، اما ترکیب برچسب ها همچنان پشتیبانی می شود.
موارد فوق را می توان به صورت زیر نیز نوشت:
برای دستورالعملهای مربوط به کلیدها و مقادیر برچسب قابل قبول، به درک برچسبهای شیء مراجعه کنید. برای اطلاع از برچسبهای پرس و جو، به موارد مربوط به فیلتر کردن در مدیریت برچسبها روی اشیا مراجعه کنید. همچنین به LABEL در مرجع Dockerfile مراجعه کنید.
عبارات RUN طولانی یا پیچیده را در چندین خط جدا شده با اسلش معکوس تقسیم کنید تا Dockerfile خود را خوانا، قابل درک و قابل نگهداری تر کنید.
apt-get
احتمالاً رایج ترین مورد استفاده برای RUN، برنامه apt-get است. از آنجا که بسته ها را نصب می کند، دستور RUN apt-get چندین گوچا دارد که باید به آنها توجه کرد.
همیشه بهروزرسانی RUN apt-get را با نصب apt-get در همان دستور RUN ترکیب کنید. مثلا:
استفاده از آپدیت apt-get به تنهایی در یک دستور RUN باعث مشکلات مربوط به کش می شود و دستورالعمل های نصب بعدی apt-get با شکست مواجه می شود. به عنوان مثال، بگویید که یک Dockerfile دارید:
پس از ساخت تصویر، تمام لایه ها در کش داکر قرار دارند. فرض کنید بعداً نصب apt-get را با اضافه کردن بسته اضافی تغییر دهید:
Docker دستورالعملهای اولیه و اصلاحشده را یکسان میبیند و از حافظه پنهان مراحل قبلی مجدداً استفاده میکند. در نتیجه به روز رسانی apt-get اجرا نمی شود زیرا ساخت از نسخه کش استفاده می کند. از آنجایی که آپدیت apt-get اجرا نمی شود، ساخت شما به طور بالقوه می تواند نسخه قدیمی بسته های curl و nginx را دریافت کند.
با استفاده از Run Apt-Get Update && apt-get instal l-y تضمین می کند که Dockerfile شما آخرین نسخه های بسته را بدون برنامه نویسی یا مداخله دستی دیگر نصب می کند. این تکنیک به عنوان "Cache Busting" شناخته می شود. همچنین می توانید با مشخص کردن نسخه بسته ، به حافظه پنهان دست یابید. به عنوان مثال به عنوان پین کردن نسخه شناخته می شود:
پین کردن نسخه باعث می شود بدون در نظر گرفتن آنچه در حافظه پنهان است ، نسخه خاصی را بازیابی کند. این تکنیک همچنین می تواند خرابی ها را به دلیل تغییرات غیرقابل پیش بینی در بسته های مورد نیاز کاهش دهد.
در زیر یک دستورالعمل اجرا به خوبی شکل گرفته است که تمام توصیه های مناسب را نشان می دهد.
آرگومان S3CMD نسخه 1. 1 را مشخص می کند.*. اگر تصویری که قبلاً از نسخه قدیمی استفاده می کرد ، مشخص کردن نسخه جدید باعث ایجاد یک شلوارپوش به روزرسانی مناسب می شود و نصب نسخه جدید را تضمین می کند. لیست بسته های موجود در هر خط همچنین می تواند از اشتباهات تکثیر بسته جلوگیری کند.
علاوه بر این ، هنگامی که حافظه نهان مناسب را با حذف/var/lib/apt/لیست ها تمیز می کنید ، اندازه تصویر را کاهش می دهد ، زیرا حافظه نهان APT در یک لایه ذخیره نمی شود. از آنجا که عبارت RUN با به روزرسانی مناسب شروع می شود ، حافظه نهان بسته همیشه قبل از نصب مناسب ، تازه می شود.
تصاویر رسمی Debian و Ubuntu به طور خودکار Clean مناسب را اجرا می کنند ، بنابراین دعوت صریح لازم نیست.
با استفاده از لوله ها
برخی از دستورات اجرا شده به توانایی لوله کشی خروجی یک دستور به دیگری ، با استفاده از کاراکتر لوله (|) ، مانند مثال زیر بستگی دارد:
Docker این دستورات را با استفاده از مترجم /bin /s h-c اجرا می کند ، که فقط کد خروج آخرین عملیات را در لوله ارزیابی می کند تا موفقیت را تعیین کند. در مثال بالا این مرحله ساخت موفق می شود و تصویر جدیدی را تولید می کند تا زمانی که فرمان W C-L موفق شود ، حتی اگر دستور WGET شکست بخورد.
اگر می خواهید این دستور به دلیل خطایی در هر مرحله از لوله شکست بخورد ، Se t-o Pipefail && را آماده کنید تا اطمینان حاصل کنید که یک خطای غیر منتظره مانع از موفقیت در ساخت سهواً می شود. مثلا:
همه پوسته ها از گزین ه-o pipefail پشتیبانی نمی کنند.
در مواردی مانند Dash Shell در تصاویر مبتنی بر Debian ، استفاده از فرم EXEC RUN را در نظر بگیرید تا صریحاً پوسته ای را انتخاب کنید که از گزینه Pipefail پشتیبانی کند. مثلا:
از دستورالعمل CMD برای اجرای نرم افزار موجود در تصویر شما ، به همراه هرگونه استدلال استفاده می شود. CMD تقریباً همیشه باید به شکل CMD ["اجرایی" ، "PARAM1" ، "PARAM2" ...] استفاده شود. بنابراین ، اگر تصویر برای یک سرویس مانند Apache و Rails باشد ، شما چیزی مانند CMD ["Apache2" ، "-Dforeground" را اجرا می کنید. در واقع ، این شکل از دستورالعمل برای هر تصویر مبتنی بر خدمات توصیه می شود.
در بیشتر موارد دیگر ، CMD باید یک پوسته تعاملی مانند Bash ، Python و Perl داده شود. به عنوان مثال ، cmd ["perl" ، "-de0"] ، cmd ["python"] یا cmd ["php" ، "-a"]. استفاده از این فرم به این معنی است که وقتی چیزی مانند Docker Ru n-it Python را اجرا می کنید ، به یک پوسته قابل استفاده ، آماده برای رفتن ، رها خواهید شد. CMD به ندرت باید به روش CMD ["Param" ، "Param"] در رابطه با EntryPoint استفاده شود ، مگر اینکه شما و کاربران مورد انتظار شما قبلاً با نحوه کار ورودی کاملاً آشنا باشید.
در معرض گذاشتن
دستورالعمل Expose پورت هایی را که یک ظرف برای اتصالات گوش می دهد ، نشان می دهد. در نتیجه ، شما باید از درگاه مشترک و سنتی برای برنامه خود استفاده کنید. به عنوان مثال ، تصویری که حاوی سرور وب Apache از Expose 80 است ، در حالی که یک تصویر حاوی MongoDB از Expose 27017 و غیره استفاده می کند.
برای دسترسی خارجی ، کاربران شما می توانند Docker Run را با یک پرچم اجرا کنند که نشان می دهد نحوه نقشه برداری درگاه مشخص شده به درگاه مورد نظر خود را نشان می دهد. برای پیوند کانتینر ، Docker متغیرهای محیطی را برای مسیر از ظرف گیرنده به منبع (یعنی MySQL_PORT_3306_TCP) فراهم می کند.
برای آسانتر کردن نرم افزار جدید ، می توانید از ENV برای به روزرسانی متغیر Path Environment برای نرم افزاری که کانتینر شما نصب می کند استفاده کنید. به عنوان مثال ، ENV PATH =/usr/local/nginx/bin: $ مسیر اطمینان می دهد که CMD ["nginx"] فقط کار می کند.
دستورالعمل ENV همچنین برای ارائه متغیرهای محیط مورد نیاز خاص برای خدماتی که می خواهید کانتینر کنید ، مانند PGDATA Postgres مفید است.
سرانجام ، از ENV همچنین می توان برای تنظیم شماره های نسخه های متداول استفاده کرد تا دست اندازهای نسخه آسانتر باشد ، همانطور که در مثال زیر مشاهده می شود:
این رویکرد مشابه داشتن متغیرهای ثابت در یک برنامه (بر خلاف مقادیر سخت کدگذاری) ، به شما امکان می دهد یک دستورالعمل ENV را تغییر دهید تا به طور خودکار نسخه نرم افزار موجود در ظرف خود را بریزید.
هر خط ENV یک لایه میانی جدید ایجاد می کند ، دقیقاً مانند دستورات اجرا. این بدان معناست که حتی اگر متغیر محیط را در یک لایه آینده باز نکنید ، هنوز در این لایه همچنان ادامه دارد و مقدار آن می تواند ریخته شود. شما می توانید این کار را با ایجاد یک dockerfile مانند موارد زیر و سپس ساخت آن آزمایش کنید.
برای جلوگیری از این امر ، و واقعاً متغیر محیط ، از یک دستور RUN با دستورات پوسته استفاده کنید تا متغیر را در یک لایه واحد تنظیم ، استفاده و بازنویسی کنید. می توانید دستورات خود را با ؛یا && . اگر از روش دوم استفاده می کنید ، و یکی از دستورات با شکست مواجه می شود ، ساخت Docker نیز از بین می رود. این معمولاً ایده خوبی است. استفاده از \ به عنوان یک شخصیت ادامه خط برای Dockerfiles Linux ، خوانایی را بهبود می بخشد. همچنین می توانید تمام دستورات را در یک اسکریپت پوسته قرار دهید و دستور اجرا را فقط آن اسکریپت پوسته را اجرا کنید.
اضافه یا کپی کنید
اگرچه اضافه کردن و کپی از نظر عملکردی مشابه است ، به طور کلی ، کپی ترجیح داده می شود. این به این دلیل است که شفاف تر از افزودن است. کپی فقط از کپی کردن اصلی پرونده های محلی در کانتینر پشتیبانی می کند ، در حالی که ADD دارای برخی از ویژگی ها (مانند استخراج TAR فقط محلی و پشتیبانی URL از راه دور) است که بلافاصله آشکار نیستند. در نتیجه ، بهترین استفاده برای افزودنی ، فایلهای محلی TAR است که به صورت خودکار در تصویر قرار می گیرد ، همانطور که در rootfs. tar. xz /.
اگر چندین مرحله dockerfile دارید که از پرونده های مختلف از متن خود استفاده می کنند ، آنها را به صورت جداگانه کپی کنید ، نه همه به یکباره. این تضمین می کند که حافظه نهان ساخت هر مرحله فقط در صورت تغییر پرونده های مورد نیاز ، فقط باطل می شود (مجبور به اجرای مجدد مرحله).
نتیجه در مرحله اجرا ، باعث عدم اعتبار بیشتر حافظه پنهان برای مرحله اجرا می شود./ TMP/ قبل از آن.
از آنجا که اندازه تصویر اهمیت دارد ، استفاده از بسته های Add to Fetch از URL های از راه دور به شدت دلسرد می شود. به جای آن باید از curl یا wget استفاده کنید. به این ترتیب می توانید پس از استخراج پرونده هایی که دیگر نیازی به آنها ندارید ، حذف کنید و نیازی به اضافه کردن لایه دیگری در تصویر خود نیست. به عنوان مثال ، شما باید از انجام کارهایی مانند:
و در عوض ، کاری مانند:
برای سایر موارد (پرونده ها ، دایرکتوری ها) که نیازی به قابلیت آزمایش خودکار TAR اضافه نمی کنند ، همیشه باید از کپی استفاده کنید.
نقطه ورود
بهترین استفاده برای ورودی ، تنظیم دستور اصلی تصویر است ، اجازه می دهد تا آن تصویر اجرا شود که گویی آن دستور است (و سپس از CMD به عنوان پرچم های پیش فرض استفاده کنید).
بیایید با نمونه ای از یک تصویر برای ابزار خط فرمان S3CMD شروع کنیم:
اکنون می توان تصویر را به این شکل اجرا کرد تا کمک دستور را نشان دهد:
یا با استفاده از پارامترهای مناسب برای اجرای یک دستور:
این مفید است زیرا نام تصویر می تواند به عنوان مرجع باینری همانطور که در دستور بالا نشان داده شده است ، دو برابر شود.
دستورالعمل ورودی نیز می تواند در ترکیب با یک اسکریپت یاور استفاده شود و به آن اجازه می دهد تا به روشی مشابه دستور بالا عمل کند ، حتی هنگام شروع ابزار ممکن است بیش از یک مرحله نیاز داشته باشد.
به عنوان مثال ، تصویر رسمی Postgres از اسکریپت زیر به عنوان ورودی خود استفاده می کند:
پیکربندی برنامه به عنوان PID 1
این اسکریپت از دستور EXEC BASH استفاده می کند تا برنامه نهایی در حال اجرا به PID 1. کانتینر تبدیل شود. این به برنامه اجازه می دهد تا هر سیگنال UNIX را که به ظرف ارسال شده است ، دریافت کند. برای اطلاعات بیشتر ، به مرجع ورودی مراجعه کنید.
اسکریپت یاور در ظرف کپی شده و از طریق ورودی در شروع کانتینر اجرا می شود:
این اسکریپت به کاربر اجازه می دهد تا از چند طریق با Postgres ارتباط برقرار کند.
این به سادگی می تواند Postgres را شروع کند:
یا می توان از آن برای اجرای Postgres و انتقال پارامترها به سرور استفاده کرد:
سرانجام ، می توان از آن برای شروع ابزاری کاملاً متفاوت مانند Bash استفاده کرد:
جلد
دستورالعمل حجم باید برای افشای هر منطقه ذخیره سازی پایگاه داده ، ذخیره سازی پیکربندی یا پرونده ها/پوشه های ایجاد شده توسط ظرف Docker شما استفاده شود. شما به شدت تشویق می شوید که از حجم برای هر قسمت قابل تغییر و/یا کاربر قابل استفاده در تصویر خود استفاده کنید.
اگر یک سرویس می تواند بدون امتیاز اجرا شود ، از کاربر برای تغییر به یک کاربر غیر ریشه استفاده کنید. با ایجاد کاربر و گروه در Dockerfile با چیزی مانند:
UID/GID صریح را در نظر بگیرید
به کاربران و گروه های یک تصویر یک UID/GID غیر تعیین کننده اختصاص داده می شود که UID/GID "بعدی" بدون در نظر گرفتن بازسازی تصویر اختصاص می یابد. بنابراین ، اگر بسیار مهم است ، باید یک UID/GID صریح اختصاص دهید.
با توجه به یک اشکال حل نشده در Archive/Tar Package از پرونده های پراکنده ، تلاش برای ایجاد یک کاربر با UID قابل توجهی بزرگ در داخل یک ظرف Docker می تواند منجر به فرسودگی دیسک شود زیرا/var/log/faillog در لایه کانتینر پر شده استشخصیت های تهی (\ 0). راه حل این است که پرچم-بدون ورود به سیستم را به UserAdd منتقل کنید. بسته بندی Debian/Ubuntu Adduser از این پرچم پشتیبانی نمی کند.
از نصب یا استفاده از SUDO خودداری کنید زیرا این رفتار غیرقابل پیش بینی و رفتارهای سیگنال است که می تواند باعث ایجاد مشکلاتی شود. اگر کاملاً به عملکردی مشابه SUDO نیاز دارید ، مانند اولیه سازی Daemon به عنوان ریشه اما اجرای آن به عنوان غیر ریشه ، استفاده از "GOSU" را در نظر بگیرید.
در آخر ، برای کاهش لایه ها و پیچیدگی ها ، از تغییر مکرر کاربر به جلو و عقب خودداری کنید.
کارگاه
برای وضوح و قابلیت اطمینان ، همیشه باید از مسیرهای مطلق برای کار خود استفاده کنید. همچنین ، شما باید به جای دستورالعمل های تکثیر مانند Run CD… && do-your-thing ، که خواندن ، عیب یابی و نگهداری آنها دشوار است ، از WorkDir استفاده کنید.
در حال ساخت
یک دستور OnBuild پس از اتمام ساخت فعلی Dockerfile اجرا می شود. OnBuild در هر تصویر کودک حاصل از تصویر فعلی اجرا می شود. به دستور OnBuild به عنوان دستورالعمل Dockerfile والدین به کودک Dockerfile فکر کنید.
ساخت Docker قبل از هر دستور در یک Dockerfile کودک ، دستورات OnBuild را اجرا می کند.
OnBuild برای تصاویری که از یک تصویر معین ساخته می شوند مفید است. به عنوان مثال ، شما از OnBuild برای یک تصویر پشته زبانی استفاده می کنید که نرم افزار کاربر دلخواه را که به آن زبان در Dockerfile نوشته شده است ، ایجاد می کند ، همانطور که می توانید در انواع OnBuild Ruby مشاهده کنید.
تصاویر ساخته شده با OnBuild باید یک برچسب جداگانه دریافت کنند ، به عنوان مثال: Ruby: 1. 9-Onbuild یا Ruby: 2. 0-onfuild.
هنگام قرار دادن ADD یا کپی در OnBuild مراقب باشید. اگر زمینه ساخت جدید از دست رفته منبع اضافه شده باشد ، تصویر "OnBuild" به طرز فاجعه آمیز از بین می رود. اضافه کردن یک برچسب جداگانه ، همانطور که در بالا توصیه شد ، با اجازه دادن به نویسنده Dockerfile به انتخاب ، به کاهش این موضوع کمک می کند.