داکر و ۱۳ ترفند مهم در آن
داکر به یک ابزار مهم خط لوله برای توسعه، استقرار و تست برنامه در دنیای مدرن مهندسی تبدیل شده، در حالیکه بیشتر کاربران با مسائل پایه و دستورات اولیه آن اشنا هستند اینجا وجود داره یکسری ویژگیها و ترفندهایی که کار کردن رو ساده و توسعه رو بهتر میکنه
در اینجا 13 ترفند داکر رو با موضوعیتی برای مهندسین ارشد بررسی میکنیم که فراتر از اصول اولیه هستند و راه های قدرتمند و کمتر شناخته شده ای را برای استفاده از داکر ارائه معرفی میکنیم
1-ساخت چند مرحلهای برای تصاویر (image) کارآمد
ساختهای چند مرحلهای در داکر یک تکنیک قدرتمند برای ایجاد تصاویری ناب و ایمنتر با جدا کردن محیط ساخت از محیط تولید در همان داکرفایل است
ساخت چندمرحلهای چیست
ساخت چندمرحلهای در ساخت تصاویر این امکان رو به ما میدن که در داکر فایل از چند دستور FROM استفاده کنیم، هر دستورالعمل FROM میتونه از بیس متفاوتی استفاده کنه و هر استیج نام خودش رو داشته باشه، بدینگونه شما میتونید مصنوعات رو از یک استیج به دیگری کپی کرده و هر قسمت رو که لازم ندارید پشت سر بگذارید
این مثال یک ساخت ساده چند مرحله ای برای یک برنامه Go را نشان می دهد. مرحله ساخت از یک تصویر گولنگ برای کامپایل برنامه استفاده می کند و مرحله نهایی یک تصویر سبک وزن alpine رو می سازه که فقط شامل باینری کامپایل شده هستش
چه وقتی شما از ساخت چند مرحلهای استفاده میکنید
بهترین رویکرد
بهینه سازی استفاده از کش ساخت:
دستورات کپی را سفارشی کنید و با دقت اجرا کنید تا ذخیره لایه ها به حداکثر برسد
کوچک کردن اندازه تصویر نهایی: فقط مصنوعات مورد نیاز برای اجرای برنامه را در تصویر نهایی کپی کنید
مراحل ساخت برچسب: از مراحل نامگذاری شده برای بهبود خوانایی و قابلیت نگهداری داکرفایل خود استفاده کنید
دامهای رایج
پیچیدگی بیش از حد: از ساختهای پیچیده چند مرحلهای غیرضروری که میتواند منجر به نگهداری داکرفایل دشوار شود، اجتناب کنید
نادیده گرفتن زمینه ساخت: حواستان به زمینه ساختی باشد که به daemon داکر ارسال می کنید، زیرا زمینه های بزرگ غیر ضروری می توانند روند ساخت را کند کنند
لینک وبسایت
#docker
@code_crafters
داکر به یک ابزار مهم خط لوله برای توسعه، استقرار و تست برنامه در دنیای مدرن مهندسی تبدیل شده، در حالیکه بیشتر کاربران با مسائل پایه و دستورات اولیه آن اشنا هستند اینجا وجود داره یکسری ویژگیها و ترفندهایی که کار کردن رو ساده و توسعه رو بهتر میکنه
در اینجا 13 ترفند داکر رو با موضوعیتی برای مهندسین ارشد بررسی میکنیم که فراتر از اصول اولیه هستند و راه های قدرتمند و کمتر شناخته شده ای را برای استفاده از داکر ارائه معرفی میکنیم
1-ساخت چند مرحلهای برای تصاویر (image) کارآمد
ساختهای چند مرحلهای در داکر یک تکنیک قدرتمند برای ایجاد تصاویری ناب و ایمنتر با جدا کردن محیط ساخت از محیط تولید در همان داکرفایل است
ساخت چندمرحلهای چیست
ساخت چندمرحلهای در ساخت تصاویر این امکان رو به ما میدن که در داکر فایل از چند دستور FROM استفاده کنیم، هر دستورالعمل FROM میتونه از بیس متفاوتی استفاده کنه و هر استیج نام خودش رو داشته باشه، بدینگونه شما میتونید مصنوعات رو از یک استیج به دیگری کپی کرده و هر قسمت رو که لازم ندارید پشت سر بگذارید
# Syntax for multi-stage builds
# Stage 1: Build the application
FROM golang:1.15 AS builder
WORKDIR /app
COPY . .
RUN go build -o myapp .
# Stage 2: Create the final image
FROM alpine:latest
COPY --from=builder /app/myapp /app/myapp
ENTRYPOINT ["/app/myapp"]
این مثال یک ساخت ساده چند مرحله ای برای یک برنامه Go را نشان می دهد. مرحله ساخت از یک تصویر گولنگ برای کامپایل برنامه استفاده می کند و مرحله نهایی یک تصویر سبک وزن alpine رو می سازه که فقط شامل باینری کامپایل شده هستش
چه وقتی شما از ساخت چند مرحلهای استفاده میکنید
کاهش اندازه تصویر: زمانی که فرآیند ساخت برنامه شما شامل کامپایل کد یا شامل وابستگی های زمان ساخت است که در زمان اجرا مورد نیاز نیستند
افزایش امنیت: برای به حداقل رساندن سطح حمله تصویر نهایی خود با حذف ابزارها و فایل هایی که برای اجرای برنامه مورد نیاز نیستند
جداسازی محیط های ساخت: زمانی که نیاز به ساخت برنامه های کاربردی در یک محیط خاص دارید اما می خواهید آنها را در محیط دیگری اجرا کنید.
بهترین رویکرد
بهینه سازی استفاده از کش ساخت:
دستورات کپی را سفارشی کنید و با دقت اجرا کنید تا ذخیره لایه ها به حداکثر برسد
کوچک کردن اندازه تصویر نهایی: فقط مصنوعات مورد نیاز برای اجرای برنامه را در تصویر نهایی کپی کنید
مراحل ساخت برچسب: از مراحل نامگذاری شده برای بهبود خوانایی و قابلیت نگهداری داکرفایل خود استفاده کنید
دامهای رایج
پیچیدگی بیش از حد: از ساختهای پیچیده چند مرحلهای غیرضروری که میتواند منجر به نگهداری داکرفایل دشوار شود، اجتناب کنید
نادیده گرفتن زمینه ساخت: حواستان به زمینه ساختی باشد که به daemon داکر ارسال می کنید، زیرا زمینه های بزرگ غیر ضروری می توانند روند ساخت را کند کنند
لینک وبسایت
#docker
@code_crafters
❤2👍1
2-له کردن (Squashing) لایههای ایمیج داکر
له کردن لایه های تصویر در داکر تکنیکی است که می تواند اندازه تصاویر داکر شما را به میزان قابل توجهی کاهش دهد.با ترکیب تمام لایه های تولید شده در طول ساخت تصویر در یک لایه، میتوانید ذخیره سازی و توزیع تصاویر داکر خود را بهینه کنید
له کردن چیست
هنگامی که یک تصویر داکر می سازید، هر دستورالعمل در داکرفایل یک لایه جدید ایجاد می کند.این لایهها میتوانند دادههای غیرضروری را جمعآوری کنند که منجر به ایجاد تصاویر متورم میشود. (له کردن) Squashing تعداد لایه ها را در تصاویر داکر با ادغام آنها در یک لایه کاهش می دهد، که می تواند به حداقل رساندن اندازه تصویر کمک کند
چگونه از له کردن استفاده کنیم
برای له کردن لایههای تصویر، میتوانید هنگام ساخت تصاویر خود با فعال کردن Docker BuildKit از فلگ sqash-- استفاده کنید
چه وقتی از له کردن استفاده کنیم
بهینه سازی اندازه تصویر: زمانی که نیاز به کاهش اندازه تصویر نهایی داکر خود دارید، از squashing استفاده کنید، به خصوص هنگام توزیع تصاویر در یک شبکه یا ذخیره آنها در یک رجیستری
ساده سازی لایه های تصویر: اگر داکرفایل شما حاوی دستورالعمل های اجرا یا کپی زیادی است که تعداد لایه ها و اندازه کلی تصویر را افزایش می دهد
بهترین رویکرد
له کردن انتخابی: در نظر بگیرید که کدام تصاویر بیشتر از له کردن سود می برند. ممکن است برخی از لایهها برای اهداف ذخیرهسازی، بهویژه در حین توسعه، بدون شکست باقی بمانند.
مراقب ذخیره سازی باشید: Squashing می تواند بر مکانیسم کش لایه Docker تأثیر بگذارد. له کردن مکرر ممکن است منجر به زمان ساخت طولانیتر شود، زیرا داکر نمیتواند لایههای میانی را به طور موثر کش کند.
پیامدهای امنیتی: بدانید که له کردن ممکن است تاریخچه یک تصویر را پنهان کند. اطمینان حاصل کنید که لایه نهایی له شده سهوا حاوی داده های حساسی نیست که در لایه های میانی دور ریخته می شوند.
دامهای رایج
استفاده بیش از حد در طول توسعه: له کردن پس از هر ساخت در طول توسعه می تواند به دلیل از بین رفتن مزایای ذخیره سازی، زمان ساخت را به طور قابل توجهی کاهش دهد.
نادیده گرفتن وضعیت آزمایشی: به یاد داشته باشید که ویژگی squash آزمایشی است و ممکن است در نسخهها یا پیکربندیهای مختلف داکر به طور مداوم رفتار نکند
لینک وبسایت
#docker
@code_crafters
له کردن لایه های تصویر در داکر تکنیکی است که می تواند اندازه تصاویر داکر شما را به میزان قابل توجهی کاهش دهد.با ترکیب تمام لایه های تولید شده در طول ساخت تصویر در یک لایه، میتوانید ذخیره سازی و توزیع تصاویر داکر خود را بهینه کنید
له کردن چیست
هنگامی که یک تصویر داکر می سازید، هر دستورالعمل در داکرفایل یک لایه جدید ایجاد می کند.این لایهها میتوانند دادههای غیرضروری را جمعآوری کنند که منجر به ایجاد تصاویر متورم میشود. (له کردن) Squashing تعداد لایه ها را در تصاویر داکر با ادغام آنها در یک لایه کاهش می دهد، که می تواند به حداقل رساندن اندازه تصویر کمک کند
چگونه از له کردن استفاده کنیم
برای له کردن لایههای تصویر، میتوانید هنگام ساخت تصاویر خود با فعال کردن Docker BuildKit از فلگ sqash-- استفاده کنید
# Enable Docker BuildKit
export DOCKER_BUILDKIT=1
# Build and squash the image
docker build --tag myapp:latest --squash .
چه وقتی از له کردن استفاده کنیم
بهینه سازی اندازه تصویر: زمانی که نیاز به کاهش اندازه تصویر نهایی داکر خود دارید، از squashing استفاده کنید، به خصوص هنگام توزیع تصاویر در یک شبکه یا ذخیره آنها در یک رجیستری
ساده سازی لایه های تصویر: اگر داکرفایل شما حاوی دستورالعمل های اجرا یا کپی زیادی است که تعداد لایه ها و اندازه کلی تصویر را افزایش می دهد
بهترین رویکرد
له کردن انتخابی: در نظر بگیرید که کدام تصاویر بیشتر از له کردن سود می برند. ممکن است برخی از لایهها برای اهداف ذخیرهسازی، بهویژه در حین توسعه، بدون شکست باقی بمانند.
مراقب ذخیره سازی باشید: Squashing می تواند بر مکانیسم کش لایه Docker تأثیر بگذارد. له کردن مکرر ممکن است منجر به زمان ساخت طولانیتر شود، زیرا داکر نمیتواند لایههای میانی را به طور موثر کش کند.
پیامدهای امنیتی: بدانید که له کردن ممکن است تاریخچه یک تصویر را پنهان کند. اطمینان حاصل کنید که لایه نهایی له شده سهوا حاوی داده های حساسی نیست که در لایه های میانی دور ریخته می شوند.
دامهای رایج
استفاده بیش از حد در طول توسعه: له کردن پس از هر ساخت در طول توسعه می تواند به دلیل از بین رفتن مزایای ذخیره سازی، زمان ساخت را به طور قابل توجهی کاهش دهد.
نادیده گرفتن وضعیت آزمایشی: به یاد داشته باشید که ویژگی squash آزمایشی است و ممکن است در نسخهها یا پیکربندیهای مختلف داکر به طور مداوم رفتار نکند
لینک وبسایت
#docker
@code_crafters
❤2
3-docker buildkit secret
داکر BuildKit راه امن تری را برای رسیدگی به سکرتها در طول فرآیند ساخت معرفی می کند و چالش استفاده از منابع خصوصی را بدون افشای آنها در تصویر نهایی برطرف می کند. قابلیتهای مدیریت مخفی BuildKit به شما این امکان را میدهد که اطلاعات حساس را در طول ساخت بدون باقی ماندن ردی در لایههای تصویر ارسال کنید.
داکر buildkit سکرت چیست
یک ویژگی سیستم ساخت داکر buildkit است. این به شما این امکان رو میده تا اطلاعات مخفی و سکرت (مانند رمزهای عبور، کلیدهای خصوصی یا نشانه های API) را به طور ایمن به فرآیند ساخت منتقل کنید. این سکرتها در تصویر نهایی یا در لایههای میانی ذخیره نمیشوند و فرآیند ساخت شما را امنتر میکنند
چگونه از داکر buildkit سکرت استفاده کنیم
برای استفاده از داکر BuildKit سکرت، ابتدا مطمئن شوید که Docker BuildKit فعال است.می توانید این کار را با تنظیم متغیر محیطی DOCKER_BUILDKIT=1 انجام دهید. سپس، از فلگ secret-- در طول فرآیند ساخت برای ارائه رازها استفاده کنید
چه وقتی از داکر buildkit سکرت استفاده کنیم
دسترسی به مخازن خصوصی Git: زمانی که ساخت شما نیاز به pull کردن وابستگی ها از مخازن خصوصی دارد(یک پکیج خصوصی توسعه دادهاید و در اکانت خودتون گذاشتهاید)
استفاده از کلیدهای خصوصی: زمانی که نیاز به استفاده از کلیدهای خصوصی برای دسترسی SSH یا رمزگشایی فایل ها در حین ساخت دارید
توکن های API: زمانی که فرآیند ساخت شما شامل دسترسی به API هایی است که نیاز به احراز هویت دارند
بهترین رویکرد
به حداقل رساندن قرار گرفتن در معرض مخفیانه: فقط در صورت لزوم از اسرار استفاده کنید و از ثبت یا افشای آنها در مراحل میانی خودداری کنید
اسکوپهای سکرت: اسرار را به وضوح تعریف کرده و به مراحل ساخت خاصی که در آن مورد نیاز است، بسط دهید و خطر مواجهه را کاهش دهید
نسخه pinning : همیشه هنگام استفاده از ویژگیهای BuildKit، نسخه نحو را در داکر خود پین کنید تا از سازگاری و پیشبینیپذیری اطمینان حاصل کنید.
دامهای رایج:
کدگذاری بصورت سخت (hardcoding): از کدگذاری بصورتسخت یا استفاده از روشهای منسوخ (مثلاً ARG برای انتقال سکرت) که ممکن است اطلاعات حساسی را در لایههای تصویر باقی بگذارند، خودداری کنید
در شرف پاکسازی: با بازرسی لایههای نهایی یا ایجاد سهوا لایههای ذخیرهسازی با دادههای مخفی، مطمئن شوید که هیچ باقیمانده مخفی در تصویر باقی نمانده است
توضیحات تکمیلی
ویژگی buildkit در نسخههای جدید داکر و داکرکامپوز بصورت پیش فرض فعال می باشد که با تکنیکهای خاصی سرعت ایجاد تصاویر رو افزایش میده
در خصوص pinning قابلیتی که به شما این امکان رو میده تا از نسخههای خاصی از ابزارها و وابستگیها استفاده کنند، که در یک فایل با نام build.yml نوشته میشه و در کنار داکرفایل قرار میگیرد برای مثال در پایتون و جنگو داکرفایل ما بصورت زیر می باشد
لینک وبسایت
#docker
@code_crafters
داکر BuildKit راه امن تری را برای رسیدگی به سکرتها در طول فرآیند ساخت معرفی می کند و چالش استفاده از منابع خصوصی را بدون افشای آنها در تصویر نهایی برطرف می کند. قابلیتهای مدیریت مخفی BuildKit به شما این امکان را میدهد که اطلاعات حساس را در طول ساخت بدون باقی ماندن ردی در لایههای تصویر ارسال کنید.
داکر buildkit سکرت چیست
یک ویژگی سیستم ساخت داکر buildkit است. این به شما این امکان رو میده تا اطلاعات مخفی و سکرت (مانند رمزهای عبور، کلیدهای خصوصی یا نشانه های API) را به طور ایمن به فرآیند ساخت منتقل کنید. این سکرتها در تصویر نهایی یا در لایههای میانی ذخیره نمیشوند و فرآیند ساخت شما را امنتر میکنند
چگونه از داکر buildkit سکرت استفاده کنیم
برای استفاده از داکر BuildKit سکرت، ابتدا مطمئن شوید که Docker BuildKit فعال است.می توانید این کار را با تنظیم متغیر محیطی DOCKER_BUILDKIT=1 انجام دهید. سپس، از فلگ secret-- در طول فرآیند ساخت برای ارائه رازها استفاده کنید
# Enable Docker BuildKit
export DOCKER_BUILDKIT=1
# Build with a secret
docker build --secret id=mysecret,src=/path/to/secret/file.txt -t myapp:latest .
چه وقتی از داکر buildkit سکرت استفاده کنیم
دسترسی به مخازن خصوصی Git: زمانی که ساخت شما نیاز به pull کردن وابستگی ها از مخازن خصوصی دارد(یک پکیج خصوصی توسعه دادهاید و در اکانت خودتون گذاشتهاید)
استفاده از کلیدهای خصوصی: زمانی که نیاز به استفاده از کلیدهای خصوصی برای دسترسی SSH یا رمزگشایی فایل ها در حین ساخت دارید
توکن های API: زمانی که فرآیند ساخت شما شامل دسترسی به API هایی است که نیاز به احراز هویت دارند
بهترین رویکرد
به حداقل رساندن قرار گرفتن در معرض مخفیانه: فقط در صورت لزوم از اسرار استفاده کنید و از ثبت یا افشای آنها در مراحل میانی خودداری کنید
اسکوپهای سکرت: اسرار را به وضوح تعریف کرده و به مراحل ساخت خاصی که در آن مورد نیاز است، بسط دهید و خطر مواجهه را کاهش دهید
نسخه pinning : همیشه هنگام استفاده از ویژگیهای BuildKit، نسخه نحو را در داکر خود پین کنید تا از سازگاری و پیشبینیپذیری اطمینان حاصل کنید.
دامهای رایج:
کدگذاری بصورت سخت (hardcoding): از کدگذاری بصورتسخت یا استفاده از روشهای منسوخ (مثلاً ARG برای انتقال سکرت) که ممکن است اطلاعات حساسی را در لایههای تصویر باقی بگذارند، خودداری کنید
در شرف پاکسازی: با بازرسی لایههای نهایی یا ایجاد سهوا لایههای ذخیرهسازی با دادههای مخفی، مطمئن شوید که هیچ باقیمانده مخفی در تصویر باقی نمانده است
توضیحات تکمیلی
ویژگی buildkit در نسخههای جدید داکر و داکرکامپوز بصورت پیش فرض فعال می باشد که با تکنیکهای خاصی سرعت ایجاد تصاویر رو افزایش میده
در خصوص pinning قابلیتی که به شما این امکان رو میده تا از نسخههای خاصی از ابزارها و وابستگیها استفاده کنند، که در یک فایل با نام build.yml نوشته میشه و در کنار داکرفایل قرار میگیرد برای مثال در پایتون و جنگو داکرفایل ما بصورت زیر می باشد
FROM python:3.9و فایل build.yml ما بصورت زیر خواهد بود
RUN pip install --upgrade pip
RUN pip install django==4.1.5
COPY . /app
CMD python manage.py runserver 0.0.0.0:8000
build:این فایل محدودیت استفاده از ابزار و نسخه خاص رو بر روی داکر ایجاد میکند، موجب افزایش امنیت و رعایت وابستگیها میشه و ایمیجهای تکرار شونده رو براتون بوجود میاره ، اما انعطاف شمارو در ساخت ایمیج پایین میاره
pins:
- name: python
version: "3.9"
- name: pip
version: "22.3.1"
- name: django
version: "4.1.5"
لینک وبسایت
#docker
@code_crafters
❤2👎1
4-اهرم dockerignore.
فایل .dockerignore نقش مهمی در بهینهسازی ساختهای Docker بازی میکند، زیرا به شما امکان میدهد الگوهایی را مشخص کنید که فایلها و دایرکتوریها را از متن ارسال شده به Daemon داکر حذف میکند. این مکانیسم می تواند به طور قابل توجهی روند ساخت را سرعت ببخشد، اندازه زمینه ساخت را کاهش دهد و با حذف فایل های حساس، امنیت را افزایش دهد
این dockerignore چیست
مانند gitignore.، فایل .dockerignore به داکر میگوید کدام فایلها و دایرکتوریها را هنگام ساختن یک تصویر نادیده بگیرد.این امر به ویژه مهم است زیرا هر فایلی که به عنوان بخشی از زمینه ساخت به Daemon داکر ارسال می شود، می تواند زمان ساخت و پیچیدگی غیر ضروری را به خصوص در پروژه های بزرگ افزایش دهد.
استفاده از dockerignore
یک فایل .dockerignore در ریشه پروژه خود، جایی که Dockerfile شما قرار دارد، ایجاد کنید. در این فایل، الگوهایی را برای فایلها و دایرکتوریها مشخص کنید تا از زمینه ساخت Docker حذف شوند.
نمونه ای از فایل .dockerignore
چه وقتی از dockerignore استفاده کنیم
مخازن بزرگ: برای پروژه هایی با حجم زیاد داده، به خصوص آنهایی که برای ساخت یا زمان اجرا مورد نیاز نیستند
اطلاعات حساس: برای حذف فایلهای حاوی سکرتها(env.) یا اطلاعات حساسی که نباید در زمینه ساخت Docker گنجانده شوند
دایرکتوریهای وابستگی: برای زبانهایی که وابستگیها را در فهرستهای محلی دانلود میکنند (مانند venv در پایتون)، که اگر در حین ساخت، وابستگیها را نصب میکنید، در زمینه ساخت مورد نیاز نیستند
بهترین رویکرد
مرتباً مرور کنید: بهطور دورهای فایل .dockerignore خود را بررسی کنید تا مطمئن شوید که با ساختار و الزامات پروژه شما بهروز است
الگوهای واضح: از الگوهای صریح استفاده کنید تا فایل ها و دایرکتوری های مورد نظر را دقیقاً مطابقت دهند و از حذف ناخواسته اجتناب کنید
حفظ امنیت: از .dockerignore برای تقویت امنیت با اطمینان از اینکه فقط فایل های لازم در زمینه ساخت شما گنجانده شده است، استفاده کنید
دامهای رایج
نادیده گرفتن .dockerignore: عدم استفاده یا پیکربندی صحیح فایل .dockerignore می تواند منجر به ساخت کند، اندازه تصویر بزرگتر و گنجاندن احتمالی اطلاعات حساس شود
حذف بیش از حد: در حالی که حذف فایلهای غیر ضروری مهم است، مراقب باشید فایلهایی را که برای فرآیند ساخت ضروری هستند حذف نکنید، که میتواند منجر به شکست ساخت یا رفتار نادرست تصویر شود.
لینک وبسایت
#docker
@code_crafters
فایل .dockerignore نقش مهمی در بهینهسازی ساختهای Docker بازی میکند، زیرا به شما امکان میدهد الگوهایی را مشخص کنید که فایلها و دایرکتوریها را از متن ارسال شده به Daemon داکر حذف میکند. این مکانیسم می تواند به طور قابل توجهی روند ساخت را سرعت ببخشد، اندازه زمینه ساخت را کاهش دهد و با حذف فایل های حساس، امنیت را افزایش دهد
این dockerignore چیست
مانند gitignore.، فایل .dockerignore به داکر میگوید کدام فایلها و دایرکتوریها را هنگام ساختن یک تصویر نادیده بگیرد.این امر به ویژه مهم است زیرا هر فایلی که به عنوان بخشی از زمینه ساخت به Daemon داکر ارسال می شود، می تواند زمان ساخت و پیچیدگی غیر ضروری را به خصوص در پروژه های بزرگ افزایش دهد.
استفاده از dockerignore
یک فایل .dockerignore در ریشه پروژه خود، جایی که Dockerfile شما قرار دارد، ایجاد کنید. در این فایل، الگوهایی را برای فایلها و دایرکتوریها مشخص کنید تا از زمینه ساخت Docker حذف شوند.
نمونه ای از فایل .dockerignore
.git
.gitignore
Dockerfile*
*.md
node_modules
temp/
چه وقتی از dockerignore استفاده کنیم
مخازن بزرگ: برای پروژه هایی با حجم زیاد داده، به خصوص آنهایی که برای ساخت یا زمان اجرا مورد نیاز نیستند
اطلاعات حساس: برای حذف فایلهای حاوی سکرتها(env.) یا اطلاعات حساسی که نباید در زمینه ساخت Docker گنجانده شوند
دایرکتوریهای وابستگی: برای زبانهایی که وابستگیها را در فهرستهای محلی دانلود میکنند (مانند venv در پایتون)، که اگر در حین ساخت، وابستگیها را نصب میکنید، در زمینه ساخت مورد نیاز نیستند
بهترین رویکرد
مرتباً مرور کنید: بهطور دورهای فایل .dockerignore خود را بررسی کنید تا مطمئن شوید که با ساختار و الزامات پروژه شما بهروز است
الگوهای واضح: از الگوهای صریح استفاده کنید تا فایل ها و دایرکتوری های مورد نظر را دقیقاً مطابقت دهند و از حذف ناخواسته اجتناب کنید
حفظ امنیت: از .dockerignore برای تقویت امنیت با اطمینان از اینکه فقط فایل های لازم در زمینه ساخت شما گنجانده شده است، استفاده کنید
دامهای رایج
نادیده گرفتن .dockerignore: عدم استفاده یا پیکربندی صحیح فایل .dockerignore می تواند منجر به ساخت کند، اندازه تصویر بزرگتر و گنجاندن احتمالی اطلاعات حساس شود
حذف بیش از حد: در حالی که حذف فایلهای غیر ضروری مهم است، مراقب باشید فایلهایی را که برای فرآیند ساخت ضروری هستند حذف نکنید، که میتواند منجر به شکست ساخت یا رفتار نادرست تصویر شود.
لینک وبسایت
#docker
@code_crafters
Duck Typing in Python
از انجایی که پایتون داینامیک تایپ هست پس مفهوم داک تاپینیگ هم براش معنا پیدا میکنه. سیستم داک تایپینگ بر اساس اینترفیس و رفتار های ابجکت ها هست. خیلی از کلاس ها و ابزار های از موجود در پایتون از این سیستم پشتیبانی میکنند و این باعث انعطاف زیاد در کد میشه که در ادامه توضیح میدیم.
تعاریف زیادی در خصوص داک تایپینگ وجود داره، اما تعریف اصلی بر اساس این جمله معروف هست : "اگر مثل داک ( به فارسی : اردک) راه میره و مثل داک، کواک ( صدای اردک 😀) میکنه پس قطعا یک اردک است."
اگر بخواهیم این رو به برنامه نویسی تعمیم دهیم، شما میتونید چند ابجکت داشته باشید که صدای اردک در بیارن و مثل اردک راه برن و نیازی به چک کردن تایپشون که ایا اردک هستند، نباشه. داک تایپینگ یک تایپ سیستم هست که در اون، یک ابجکت میتونه سازگار با یک تایپ معین در نظر گرفته بشه اگر تمام متد ها و اتریبیوت های مورد نیاز اون تایپ رو داشته باشه. این تایپ سیستم در واقع از استفاده کردن چند ابجکت که هر کدوم از کلاس متفاوت و مستقلی هستند، در یک مفهوم خاص پشتیبانی میکنه. این امر تا زمانی ممکن هست که این کلاس ها به یک اینترفیس مشترک پایبند باشند. اگر کامل متوجه نشدید نگران نباشید با مثالی که میزنیم کاملا متوجه موضوع میشید :).
در قطعه کد زیر چند پرنده داریم که توانایی پرواز و شنا کردن رو دارند.
در این مثال سه پرنده ما میتونند هم پروار و هم شنا کنند اگرچه که هر کدوم یک کلاس جدا و مستقل از هم دیگه هستند. به دلیل اینکه هر سه کلاس ما اینترفیس مشترکی رو اراعه میدهند میتوانیم بدین صورت در کد از انها استفاده کنیم.
پایتون اهمیتی نمیده که وریبل پرنده )bird( دقیقا چه ابجکتی رو درون خودش داره و فقط متدی که بهش گفته شده رو اجرا میکنه.
اگر ابجکت ما متد مورد نظر رو داشته باشه، کد بدون مشکل اجرا میشه و این همون بحث انطعاف پذیری داک تایپینگ هست.
این بحث داک تایپینگ تو ابزار های built-in پایتون هم پیاده سازی و پشتیبانی میشه
که تو عکس1 در بخش کامنت ها میتونید ببینید.
نقاط قوت و ضعف داک تایپینگ
داک تایپینگ انعطاف پذیری زیادی رو به شما به عنوان برنامه نویس پیشنهاد میده و دلیل اصلیشم این هست نیازی به فکر کردن راجع به مفاهیم پیچیده ای مثل ارث بری و روابط بین کلاس ها، نیست.
نکات مثبت ان:
• انعطاف پذیری : میتوانید از ابجکت های مختلف بر اساس رفتار های انها بدون نگرانی درمورد تایپ انها به جای یکدیگر استفاده کنید. این ماژولار بودن و توسعه پذیری کد شما را بالا میبرد.
• سادگی : شما میتونید با تمرکز بر روی رفتار های مورد نیاز بجای تمرکز روی تایپ های خاص و کلاس ها و روابط بین انها، کدتون رو ساده کنید. این به شما اجازه میده که کد مختصر تر و رسا تری داشته باشید.
• استفاده مجدد از کد : شما میتونید از یک یا چند کلاس در یک اپ دیگر به طور مجدد استفاده کنید بدون انکه مجبور باشید سلسله مراتبی از کلاس هارو اکسپورت کنید تا کلاس مورد نظرتون کار بکنه.
خب همونطور که میدونید هیچ چیزی بی عیب و نقص نیست و داک تایپینگ هم از این قاعده مستثنی نیست.
نکات منفی ان :
• رانتایم ارور های احتمالی : شما ممکنه به یک سری ارور مرتبط با وجود نداشتن یک متد یا اتریبیوت مواجه بشید که فقط در صورت ران کردن کد متوجه این خطا خواهید شد و این منجر به رفتار غیر منتظره یا کرش کردن برنامه شما میشه.
• مشکلات نگهداری : ممکن است در دنبال کردن ابجکت هایی که باید رفتار خاضی از خود نشان بدهند دچار مشکل شوید. تغییرات در رفتار بعضی ابجکت های خاص ممکن است روی قسمت دیگری از کد تاثیر بگذارد و نگهداری کد و دیباگ کردن ان دچار مشکل شود.
#duck_typing
#type_system
#reall_python
@code_crafters
از انجایی که پایتون داینامیک تایپ هست پس مفهوم داک تاپینیگ هم براش معنا پیدا میکنه. سیستم داک تایپینگ بر اساس اینترفیس و رفتار های ابجکت ها هست. خیلی از کلاس ها و ابزار های از موجود در پایتون از این سیستم پشتیبانی میکنند و این باعث انعطاف زیاد در کد میشه که در ادامه توضیح میدیم.
تعاریف زیادی در خصوص داک تایپینگ وجود داره، اما تعریف اصلی بر اساس این جمله معروف هست : "اگر مثل داک ( به فارسی : اردک) راه میره و مثل داک، کواک ( صدای اردک 😀) میکنه پس قطعا یک اردک است."
اگر بخواهیم این رو به برنامه نویسی تعمیم دهیم، شما میتونید چند ابجکت داشته باشید که صدای اردک در بیارن و مثل اردک راه برن و نیازی به چک کردن تایپشون که ایا اردک هستند، نباشه. داک تایپینگ یک تایپ سیستم هست که در اون، یک ابجکت میتونه سازگار با یک تایپ معین در نظر گرفته بشه اگر تمام متد ها و اتریبیوت های مورد نیاز اون تایپ رو داشته باشه. این تایپ سیستم در واقع از استفاده کردن چند ابجکت که هر کدوم از کلاس متفاوت و مستقلی هستند، در یک مفهوم خاص پشتیبانی میکنه. این امر تا زمانی ممکن هست که این کلاس ها به یک اینترفیس مشترک پایبند باشند. اگر کامل متوجه نشدید نگران نباشید با مثالی که میزنیم کاملا متوجه موضوع میشید :).
در قطعه کد زیر چند پرنده داریم که توانایی پرواز و شنا کردن رو دارند.
--------------
birds_v1.py
--------------
class Duck:
def swim(self):
print("The duck is swimming")
def fly(self):
print("The duck is flying")
class Swan:
def swim(self):
print("The swan is swimming")
def fly(self):
print("The swan is flying")
class Albatross:
def swim(self):
print("The albatross is swimming")
def fly(self):
print("The albatross is flying")
در این مثال سه پرنده ما میتونند هم پروار و هم شنا کنند اگرچه که هر کدوم یک کلاس جدا و مستقل از هم دیگه هستند. به دلیل اینکه هر سه کلاس ما اینترفیس مشترکی رو اراعه میدهند میتوانیم بدین صورت در کد از انها استفاده کنیم.
>>> from birds_v1 import Duck, Swan, Albatross
>>> birds = [Duck(), Swan(), Albatross()]
>>> for bird in birds:
... bird.fly()
... bird.swim()
...
The duck is flying
The duck is swimming
The swan is flying
The swan is swimming
The albatross is flying
The albatross is swimming
پایتون اهمیتی نمیده که وریبل پرنده )bird( دقیقا چه ابجکتی رو درون خودش داره و فقط متدی که بهش گفته شده رو اجرا میکنه.
اگر ابجکت ما متد مورد نظر رو داشته باشه، کد بدون مشکل اجرا میشه و این همون بحث انطعاف پذیری داک تایپینگ هست.
این بحث داک تایپینگ تو ابزار های built-in پایتون هم پیاده سازی و پشتیبانی میشه
که تو عکس1 در بخش کامنت ها میتونید ببینید.
نقاط قوت و ضعف داک تایپینگ
داک تایپینگ انعطاف پذیری زیادی رو به شما به عنوان برنامه نویس پیشنهاد میده و دلیل اصلیشم این هست نیازی به فکر کردن راجع به مفاهیم پیچیده ای مثل ارث بری و روابط بین کلاس ها، نیست.
نکات مثبت ان:
• انعطاف پذیری : میتوانید از ابجکت های مختلف بر اساس رفتار های انها بدون نگرانی درمورد تایپ انها به جای یکدیگر استفاده کنید. این ماژولار بودن و توسعه پذیری کد شما را بالا میبرد.
• سادگی : شما میتونید با تمرکز بر روی رفتار های مورد نیاز بجای تمرکز روی تایپ های خاص و کلاس ها و روابط بین انها، کدتون رو ساده کنید. این به شما اجازه میده که کد مختصر تر و رسا تری داشته باشید.
• استفاده مجدد از کد : شما میتونید از یک یا چند کلاس در یک اپ دیگر به طور مجدد استفاده کنید بدون انکه مجبور باشید سلسله مراتبی از کلاس هارو اکسپورت کنید تا کلاس مورد نظرتون کار بکنه.
خب همونطور که میدونید هیچ چیزی بی عیب و نقص نیست و داک تایپینگ هم از این قاعده مستثنی نیست.
نکات منفی ان :
• رانتایم ارور های احتمالی : شما ممکنه به یک سری ارور مرتبط با وجود نداشتن یک متد یا اتریبیوت مواجه بشید که فقط در صورت ران کردن کد متوجه این خطا خواهید شد و این منجر به رفتار غیر منتظره یا کرش کردن برنامه شما میشه.
• مشکلات نگهداری : ممکن است در دنبال کردن ابجکت هایی که باید رفتار خاضی از خود نشان بدهند دچار مشکل شوید. تغییرات در رفتار بعضی ابجکت های خاص ممکن است روی قسمت دیگری از کد تاثیر بگذارد و نگهداری کد و دیباگ کردن ان دچار مشکل شود.
#duck_typing
#type_system
#reall_python
@code_crafters
👍5❤1👌1
حالا اگر بخواید تو کلاس کاستوم خودتون داک تایپینگ رو پیاده سازی کنید دو روش وجود داره
1. Regular methods
که دقیقا همون مثال پرنده ای که زدیم در بالا از همین روش استفاده شده ولی اگر بخوایم یک مثال کاربردی تر بزنیم میتونیم فرض کنیم میخوایم چند کلاس بسازیم واسه خواندن انواع فایل های csv, json, txt خب میایم سه تا کلاس میسازیم و واسه هر کدوم یک متد با نام مشابه برای خواندن فایل و یک اتریبیوت با نام مشابه نیز میسازیم، اینطوری یک اینترفیس یکسان و مشترک برای کلاس های مختلف با ساز و کار مختلف داریم. به راحتی میتونیم چند ابجکت مختلف از این کلاس ها بسازیم و با یک حلقه فور میتونیم از متد خواندن استفاده کنیم.
2. Special methods
اسپشیال متد ها یا همون داندر متد ها، با دوتا اندراسکور در اول و اخر نامشون مشخص میشوند و معنای خاصی برای پایتون دارند.
بیاید فرض کنیم میخوایم یک صف )queue( درست کنیم
و میخوایم که صف ما iterable باشه و همچنین بتونیم از
Len, reversed , in استفاده کنیم
خب کد ما به به این شکل خواهد شد :
خب تو این کلاس ما دوتا عملیات کلاسیک اضافه کردن به صف و حذف کردن از صف رو داریم و همچنین چند داندر متد برای کلاس پیاده سازی کردیم تا عملیات های مورد نیاز مارو پشتیبانی کنه.
منبع
#duck_typing
#type_system
#reall_python
@code_crafters
1. Regular methods
که دقیقا همون مثال پرنده ای که زدیم در بالا از همین روش استفاده شده ولی اگر بخوایم یک مثال کاربردی تر بزنیم میتونیم فرض کنیم میخوایم چند کلاس بسازیم واسه خواندن انواع فایل های csv, json, txt خب میایم سه تا کلاس میسازیم و واسه هر کدوم یک متد با نام مشابه برای خواندن فایل و یک اتریبیوت با نام مشابه نیز میسازیم، اینطوری یک اینترفیس یکسان و مشترک برای کلاس های مختلف با ساز و کار مختلف داریم. به راحتی میتونیم چند ابجکت مختلف از این کلاس ها بسازیم و با یک حلقه فور میتونیم از متد خواندن استفاده کنیم.
2. Special methods
اسپشیال متد ها یا همون داندر متد ها، با دوتا اندراسکور در اول و اخر نامشون مشخص میشوند و معنای خاصی برای پایتون دارند.
بیاید فرض کنیم میخوایم یک صف )queue( درست کنیم
و میخوایم که صف ما iterable باشه و همچنین بتونیم از
Len, reversed , in استفاده کنیم
خب کد ما به به این شکل خواهد شد :
from collections import deque
class Queue:
def __init__(self):
self._elements = deque()
def enqueue(self, element):
self._elements.append(element)
def dequeue(self):
return self._elements.popleft()
def __iter__(self):
return iter(self._elements)
def __len__(self):
return len(self._elements)
def __reversed__(self):
return reversed(self._elements)
def __contains__(self, element):
return element in self._elements
خب تو این کلاس ما دوتا عملیات کلاسیک اضافه کردن به صف و حذف کردن از صف رو داریم و همچنین چند داندر متد برای کلاس پیاده سازی کردیم تا عملیات های مورد نیاز مارو پشتیبانی کنه.
>>> from queues import Queueمیبینید که تمام عملیات های مورد نیاز مارو به خوبی انجام میده.
>>> queue = Queue()
>>> queue.enqueue(1)
>>> queue.enqueue(2)
>>> queue.enqueue(3)
>>> [item for item in queue]
[1, 2, 3]
>>> len(queue)
3
>>> list(reversed(queue))
[3, 2, 1]
>>> 2 in queue
True
>>> 6 in queue
False
منبع
#duck_typing
#type_system
#reall_python
@code_crafters
👍4💋2❤1
دوستان عزیز داریم یه گروه جمع میکنیم که صفحات و مطالب سایت reall python رو ترجمه کنیم به زبان فارسی
اگه کسانی تمایل به همکاری دارن بهم پیام بدن که بتونیم تو این عید صفحات بیشتر و کل سایت رو ترجمه کنیم کنار هم در نهایت بعد از اتمام سایت رو بالا میاریم و اسامی افراد شرکت کننده در ترجمه صفحات هم داخلش میزاریم
یک اینکه این موضوع منجر میشه که با پایتون بیشتر آشنا بشید
ماژولها و موارد بیشتری از پایتون رو بشناسید
و اینکه بعنوان یک کار در جامعه فارسی زبان ازتون باقی خواهد مونده
اگه کسانی تمایل به همکاری دارن بهم پیام بدن که بتونیم تو این عید صفحات بیشتر و کل سایت رو ترجمه کنیم کنار هم در نهایت بعد از اتمام سایت رو بالا میاریم و اسامی افراد شرکت کننده در ترجمه صفحات هم داخلش میزاریم
یک اینکه این موضوع منجر میشه که با پایتون بیشتر آشنا بشید
ماژولها و موارد بیشتری از پایتون رو بشناسید
و اینکه بعنوان یک کار در جامعه فارسی زبان ازتون باقی خواهد مونده
👍9
5-بررسی سلامت داکرفایل
اجرای چک های سلامت مستقیماً در داکرفایل روشی قدرتمند برای نظارت خودکار بر وضعیت عملیاتی کانتینرهای شما است. با تعریف بررسی های بهداشتی، داکر می تواند تصمیمات آگاهانه ای در مورد سلامت کانتینرها بگیرد و اقدامات مناسب را انجام دهد، مانند راه اندازی مجدد کانتینر معیوب یا جلوگیری از هدایت ترافیک به آن تا زمانی که سالم شود
بررسی سلامت داکرفایل چیست
بررسی سلامت داکر دستوری است که در داکرفایل مشخص شده است که داکر به صورت دوره ای برای بررسی سلامت یک کانتینر اجرا می کند. این دستور باید نشان دهد که آیا کانتینر به درستی کار می کند یا خیر، داکر وضعیت خروج از فرمان بررسی سلامت را برای تعیین وضعیت سلامت کانتینر تفسیر می کند: وضعیت خروج 0 به معنای سالم و غیر صفر به معنای ناسالم است
چگونه از بررسی سلامت داکرفایل استفاده کنیم
بررسی های سلامت در داکرفایل با استفاده از دستورالعمل HEALTHCHECK تعریف شده است. میتوانید دستور اجرا، فاصله بین بررسیها، زمان پایان هر چک، تعداد دفعات تکرار قبل از در نظر گرفتن سرویس ناسالم، و دوره شروع برای تثبیت کانتینر قبل از شروع بررسیهای سلامت را مشخص کنید
نمونه داکرفایل با بررسی سلامت
این مثال یک بررسی سلامتی را روی ظرف Nginx تنظیم میکند و از curl برای درخواست صفحه اصلی هر 30 ثانیه استفاده میکند. اگر دستور سه بار پشت سر هم ناموفق باشد (صفحه به درستی برگردانده نشده است)، داکر ظرف را به عنوان ناسالم علامت گذاری می کند
Dockerfile
در دسترس بودن سرویس: زمانی که باید اطمینان حاصل کنید که یک سرویس در یک کانتینر در دسترس است و قبل از ارسال ترافیک به آن پاسخگو است
آمادگی وابستگی: در کاربردهای چند کانتینری، که در آن کانتینرهای خاصی به عملکرد کامل سایر کانتینرها بستگی دارند
سیستم های خود درمانی: برای ایجاد یک سیستم انعطاف پذیرتر که می تواند به طور خودکار ظروف ناسالم را راه اندازی مجدد کند
بهترین رویکرد
به حداقل رساندن تأثیر عملکرد: اطمینان حاصل کنید که دستور بررسی سلامت سبک است و تأثیر قابل توجهی بر عملکرد ظرف ندارد
دورههای شروع دقیق: یک دوره شروع واقعی را تنظیم کنید تا قبل از شروع شکست در بررسیهای سلامت، زمان کافی برای شروع اولیه به برنامه خود بدهید
از نقاط پایانی سلامت خاص استفاده کنید: ترجیح میدهید از نقاط پایانی خاص (به عنوان مثال، /healthz) استفاده کنید که سلامت اجزای مختلف برنامه را بررسی میکند، نه فقط صفحه اصلی یا یک بررسی اولیه TCP
دامهای رایج
دستورات پیچیده: از دستورات بیش از حد پیچیده بررسی سلامت که ممکن است غیرقابل اعتماد باشند یا عوارض جانبی غیرمنتظره ایجاد کنند، خودداری کنید
نادیده گرفتن وابستگی های خارجی: اگر سلامت کانتینر شما به خدمات خارجی بستگی دارد، مطمئن شوید که بررسی سلامت شما در دسترس بودن آنها را در نظر می گیرد و از مثبت کاذب جلوگیری می کند
یک نمونه برای داکرفایل جنگو
یک نمونه در داکرکامپوز
لینک وبسایت
#docker
@code_crafters
اجرای چک های سلامت مستقیماً در داکرفایل روشی قدرتمند برای نظارت خودکار بر وضعیت عملیاتی کانتینرهای شما است. با تعریف بررسی های بهداشتی، داکر می تواند تصمیمات آگاهانه ای در مورد سلامت کانتینرها بگیرد و اقدامات مناسب را انجام دهد، مانند راه اندازی مجدد کانتینر معیوب یا جلوگیری از هدایت ترافیک به آن تا زمانی که سالم شود
بررسی سلامت داکرفایل چیست
بررسی سلامت داکر دستوری است که در داکرفایل مشخص شده است که داکر به صورت دوره ای برای بررسی سلامت یک کانتینر اجرا می کند. این دستور باید نشان دهد که آیا کانتینر به درستی کار می کند یا خیر، داکر وضعیت خروج از فرمان بررسی سلامت را برای تعیین وضعیت سلامت کانتینر تفسیر می کند: وضعیت خروج 0 به معنای سالم و غیر صفر به معنای ناسالم است
چگونه از بررسی سلامت داکرفایل استفاده کنیم
بررسی های سلامت در داکرفایل با استفاده از دستورالعمل HEALTHCHECK تعریف شده است. میتوانید دستور اجرا، فاصله بین بررسیها، زمان پایان هر چک، تعداد دفعات تکرار قبل از در نظر گرفتن سرویس ناسالم، و دوره شروع برای تثبیت کانتینر قبل از شروع بررسیهای سلامت را مشخص کنید
نمونه داکرفایل با بررسی سلامت
این مثال یک بررسی سلامتی را روی ظرف Nginx تنظیم میکند و از curl برای درخواست صفحه اصلی هر 30 ثانیه استفاده میکند. اگر دستور سه بار پشت سر هم ناموفق باشد (صفحه به درستی برگردانده نشده است)، داکر ظرف را به عنوان ناسالم علامت گذاری می کند
Dockerfile
FROM nginx:latesthealth-check.sh
COPY nginx.conf /etc/nginx/nginx.conf
# Health check script
COPY health-check.sh /usr/share/nginx/html/health-check.sh
# Make the script executable
RUN chmod +x /usr/share/nginx/html/health-check.sh
EXPOSE 80
# Health check definition
HEALTHCHECK --interval=30s --timeout=10s --start-period=5s --retries=3 \
CMD /usr/share/nginx/html/health-check.sh
#!/bin/bashچه وقتی از بررسی سلامت کانتینر استفاده کنیم
if curl -sSf https://localhost:80 > /dev/null; then
exit 0
else
exit 1
fi
در دسترس بودن سرویس: زمانی که باید اطمینان حاصل کنید که یک سرویس در یک کانتینر در دسترس است و قبل از ارسال ترافیک به آن پاسخگو است
آمادگی وابستگی: در کاربردهای چند کانتینری، که در آن کانتینرهای خاصی به عملکرد کامل سایر کانتینرها بستگی دارند
سیستم های خود درمانی: برای ایجاد یک سیستم انعطاف پذیرتر که می تواند به طور خودکار ظروف ناسالم را راه اندازی مجدد کند
بهترین رویکرد
به حداقل رساندن تأثیر عملکرد: اطمینان حاصل کنید که دستور بررسی سلامت سبک است و تأثیر قابل توجهی بر عملکرد ظرف ندارد
دورههای شروع دقیق: یک دوره شروع واقعی را تنظیم کنید تا قبل از شروع شکست در بررسیهای سلامت، زمان کافی برای شروع اولیه به برنامه خود بدهید
از نقاط پایانی سلامت خاص استفاده کنید: ترجیح میدهید از نقاط پایانی خاص (به عنوان مثال، /healthz) استفاده کنید که سلامت اجزای مختلف برنامه را بررسی میکند، نه فقط صفحه اصلی یا یک بررسی اولیه TCP
دامهای رایج
دستورات پیچیده: از دستورات بیش از حد پیچیده بررسی سلامت که ممکن است غیرقابل اعتماد باشند یا عوارض جانبی غیرمنتظره ایجاد کنند، خودداری کنید
نادیده گرفتن وابستگی های خارجی: اگر سلامت کانتینر شما به خدمات خارجی بستگی دارد، مطمئن شوید که بررسی سلامت شما در دسترس بودن آنها را در نظر می گیرد و از مثبت کاذب جلوگیری می کند
یک نمونه برای داکرفایل جنگو
#----
# Use an official Python runtime as a parent image
FROM python:3.8
# Set environment variables
ENV PYTHONUNBUFFERED 1
# Set working directory
WORKDIR /app
# Copy the current directory contents into the container at /app
COPY . /app
# Install any needed dependencies specified in requirements.txt
RUN pip install --no-cache-dir -r requirements.txt
# Expose port 8000 to the outside world
EXPOSE 8000
# Define the health check command
HEALTHCHECK --interval=5s --timeout=3s \
CMD curl --silent --fail localhost:8000/health-check || exit 1
# Run the Django application
CMD ["python", "manage.py", "runserver", "0.0.0.0:8000"]
#---
یک نمونه در داکرکامپوز
#---
version: '3'
services:
web:
build:
context: .
dockerfile: Dockerfile
ports:
- "8000:8000"
restart: on-failure
healthcheck:
test: ["CMD-SHELL", "curl --silent --fail localhost:8000/health-check || exit 1"]
interval: 5s
timeout: 3s
retries: 3
#---
لینک وبسایت
#docker
@code_crafters
6-قالب بندی خروجی داکر CLI
رابط خط فرمان داکر (CLI) یک ویژگی قدرتمند برای سفارشی کردن خروجی دستورات با استفاده از گزینه formating-- فراهم می کند.این گزینه از زبان الگوی Go استفاده می کند تا به کاربران اجازه دهد دقیقاً نحوه ساختار خروجی را مشخص کنند و تجزیه یا ادغام با ابزارهای دیگر را آسان تر می کند
قالب بندی خروجی داکر CLI چیست
قالببندی خروجی داکر CLI به شما امکان میدهد تا خروجی دستورات Docker را مطابق با نیازهای خود تنظیم کنید، با استفاده از زبان قالب Go برای تعیین فرمت خروجی. این ویژگی برای استخراج قطعات خاصی از اطلاعات از خروجیهای فرمان پرمخاطب داکر، بهویژه هنگام خودکارسازی وظایف یا ادغام با خطوط لوله CI/CD بسیار ارزشمند است
چگونه از قالب بندی خروجی داکر CLI استفاده کنیم
فاگ format-- را می توان با دستورات مختلف داکر CLI برای سفارشی کردن خروجی آنها استفاده کرد.در اینجا مثالی از نحوه فهرست کردن همه شناسههای کانتینر با استفاده از قالب سفارشی آورده شده است:
این دستور شناسههای همه کانتینرهای در حال اجرا را، یکی در هر خط، بدون هیچ گونه اطلاعات یا هدر اضافی فهرست میکند
مثال پیشرفته: فهرست کردن تصاویر با ویژگی های خاص
در اینجا نحوه فهرست کردن تصاویر، نشان دادن تنها مخزن، برچسب و اندازه آنها در قالب جدول آمده است:
این دستور یک جدول با فرمت منظم از تصاویر Docker شما ایجاد می کند که فقط نام مخزن، برچسب و اندازه تصویر را نشان می دهد
چه وقتی از قالب بندی خروجی داکر CLI استفاده کنیم
اسکریپت و اتوماسیون: زمانی که نیاز به تجزیه خروجی های دستور Docker در اسکریپت ها یا ابزارهای اتوماسیون دارید
گزارش سفارشی: ایجاد گزارش یا داشبورد سفارشی که به اطلاعات خاصی از محیط Docker شما نیاز دارد
خروجی ساد: زمانی که می خواهید خروجی را برای وضوح ساده یا تمرکز بر جزئیات خاص ساده کنید
بهترین رویکرد
الگوسازی Go را درک کنید: برای استفاده مؤثر از گزینههای قالببندی، با نحو قالببندی Go آشنا شوید
از قالب بندی جدول برای خوانایی استفاده کنید: از قالب بندی جدول برای خروجی های قابل خواندن توسط انسان استفاده کنید، به خصوص هنگام به اشتراک گذاری اطلاعات با اعضای تیم
ترکیب با سایر ابزارهای یونیکس: برای پردازش قدرتمندتر، خروجی داکر فرمت شده را با ابزارهای یونیکس مانند grep، awk یا jq برای خروجی های JSON ترکیب کنید
دامهای رایج
پیچیدگی بیش از حد: از ایجاد الگوهای بیش از حد پیچیده که خواندن و نگهداری آنها سخت است خودداری کنید. آن را تا حد امکان برای کار در دست ساده نگه دارید
قالب بندی ناسازگار: هنگام استفاده از فرمت های سفارشی در میان اسکریپت ها یا ابزارهای مختلف، برای جلوگیری از سردرگمی، سازگاری را حفظ کنید
لینک وبسایت
#docker
@code_crafters
رابط خط فرمان داکر (CLI) یک ویژگی قدرتمند برای سفارشی کردن خروجی دستورات با استفاده از گزینه formating-- فراهم می کند.این گزینه از زبان الگوی Go استفاده می کند تا به کاربران اجازه دهد دقیقاً نحوه ساختار خروجی را مشخص کنند و تجزیه یا ادغام با ابزارهای دیگر را آسان تر می کند
قالب بندی خروجی داکر CLI چیست
قالببندی خروجی داکر CLI به شما امکان میدهد تا خروجی دستورات Docker را مطابق با نیازهای خود تنظیم کنید، با استفاده از زبان قالب Go برای تعیین فرمت خروجی. این ویژگی برای استخراج قطعات خاصی از اطلاعات از خروجیهای فرمان پرمخاطب داکر، بهویژه هنگام خودکارسازی وظایف یا ادغام با خطوط لوله CI/CD بسیار ارزشمند است
چگونه از قالب بندی خروجی داکر CLI استفاده کنیم
فاگ format-- را می توان با دستورات مختلف داکر CLI برای سفارشی کردن خروجی آنها استفاده کرد.در اینجا مثالی از نحوه فهرست کردن همه شناسههای کانتینر با استفاده از قالب سفارشی آورده شده است:
docker ps --format '{{.ID}}'
این دستور شناسههای همه کانتینرهای در حال اجرا را، یکی در هر خط، بدون هیچ گونه اطلاعات یا هدر اضافی فهرست میکند
مثال پیشرفته: فهرست کردن تصاویر با ویژگی های خاص
در اینجا نحوه فهرست کردن تصاویر، نشان دادن تنها مخزن، برچسب و اندازه آنها در قالب جدول آمده است:
docker images --format "table {{.Repository}}\t{{.Tag}}\t{{.Size}}"
این دستور یک جدول با فرمت منظم از تصاویر Docker شما ایجاد می کند که فقط نام مخزن، برچسب و اندازه تصویر را نشان می دهد
چه وقتی از قالب بندی خروجی داکر CLI استفاده کنیم
اسکریپت و اتوماسیون: زمانی که نیاز به تجزیه خروجی های دستور Docker در اسکریپت ها یا ابزارهای اتوماسیون دارید
گزارش سفارشی: ایجاد گزارش یا داشبورد سفارشی که به اطلاعات خاصی از محیط Docker شما نیاز دارد
خروجی ساد: زمانی که می خواهید خروجی را برای وضوح ساده یا تمرکز بر جزئیات خاص ساده کنید
بهترین رویکرد
الگوسازی Go را درک کنید: برای استفاده مؤثر از گزینههای قالببندی، با نحو قالببندی Go آشنا شوید
از قالب بندی جدول برای خوانایی استفاده کنید: از قالب بندی جدول برای خروجی های قابل خواندن توسط انسان استفاده کنید، به خصوص هنگام به اشتراک گذاری اطلاعات با اعضای تیم
ترکیب با سایر ابزارهای یونیکس: برای پردازش قدرتمندتر، خروجی داکر فرمت شده را با ابزارهای یونیکس مانند grep، awk یا jq برای خروجی های JSON ترکیب کنید
دامهای رایج
پیچیدگی بیش از حد: از ایجاد الگوهای بیش از حد پیچیده که خواندن و نگهداری آنها سخت است خودداری کنید. آن را تا حد امکان برای کار در دست ساده نگه دارید
قالب بندی ناسازگار: هنگام استفاده از فرمت های سفارشی در میان اسکریپت ها یا ابزارهای مختلف، برای جلوگیری از سردرگمی، سازگاری را حفظ کنید
لینک وبسایت
#docker
@code_crafters
Property and Descriptor-Based Attributes
Property
پایتون به شما امکان میدهد رفتاری شبیه به تابع را بر روی اتریبیوت های موجود در کلاس اضافه کنید و آنها را به اتریبیوت های مدیریتشده (managed attribute) تبدیل کنید. این نوع ویژگی از بروز تغییرات اساسی در APIیعنی همان اینترفیس عمومی های شما جلوگیری میکند.
به عبارت دیگر، با اتریبیوت های مدیریت شده، شما میتوانید همزمان از رفتار شبیه به تابع و دسترسی شبیه به اتریبیوت بهرهمند شوید. نیازی به تغییر APIهای خود با جایگزین کردن اتریبیوت ها با متدها نیست، که ممکن است کد کاربرانتان را دچار مشکل کند.
برای ایجاد یک اتریبیوت مدیریت شده با رفتار شبیه به تابع در پایتون، شما میتوانید از یک property یا یک descriptor استفاده کنید، بسته به نیازهای خاص خود.
به عنوان مثال، به کلاس Circle خود برگردید و فرض کنید که نیاز دارید شعاع را تایید کنید تا اطمینان حاصل شود که فقط اعداد مثبت ذخیره میشوند. چگونه این کار را بدون تغییر اینترفیس کلاس انجام میدهید؟ سریعترین روش برای حل این مشکل استفاده از یک property و پیادهسازی منطق ولیدیشن( اعتبارسنجی) در متد setter است.
برای تبدیل اتریبیوت radius به یک پراپرتی، از دکوریتور property استفاده میکنیم یک متد getter بنویسیم. این متد هنگامی اجرا میشه که میخواهیم مقدار اتریبیوت radius رو مشاهده کنیم، پس قطعا باید مقدار شعاع رو به ما ریترن(return) کنه.
برای اینکه یک متد setter برای پراپرتی شعاع مون بنویسم از دکوریتور @ attr_name.setter استفاده میکنیم.
حال داخل متد setter میایم و منطق اعتبارسنجی که نیاز داشتیم رو پیاده میکنیم و اگر عدد طبق چیزی که انتظار داشتیم نبود به ما خطا میدهد در غیر این صورت در یک اتریبیوت non-public به نام _radius ذخیره میکنیم. حالا اتریبیوت radius ما تبدیل به یک پراپرتی شده و هرموقع که نیاز به مشاهده مقدار یا تغییر مقدار ان بودیم خود پایتون اتومات، ابتدا با توجه به عملیات یکی از متد های getter یا setter رو کال میکنه.
نحوه کارکرد اون به شکل زیر هست.
میبینید که با اتریبیوت radius دارید به طور عادی رفتار میکنید اما در پشت قضیه، یک رفتار متد مانند دارد و اگر مقدار نامعتبر دهید خطا میدهد.
منبع
#Property #Python
@Code_Crafters
Property
پایتون به شما امکان میدهد رفتاری شبیه به تابع را بر روی اتریبیوت های موجود در کلاس اضافه کنید و آنها را به اتریبیوت های مدیریتشده (managed attribute) تبدیل کنید. این نوع ویژگی از بروز تغییرات اساسی در APIیعنی همان اینترفیس عمومی های شما جلوگیری میکند.
به عبارت دیگر، با اتریبیوت های مدیریت شده، شما میتوانید همزمان از رفتار شبیه به تابع و دسترسی شبیه به اتریبیوت بهرهمند شوید. نیازی به تغییر APIهای خود با جایگزین کردن اتریبیوت ها با متدها نیست، که ممکن است کد کاربرانتان را دچار مشکل کند.
برای ایجاد یک اتریبیوت مدیریت شده با رفتار شبیه به تابع در پایتون، شما میتوانید از یک property یا یک descriptor استفاده کنید، بسته به نیازهای خاص خود.
به عنوان مثال، به کلاس Circle خود برگردید و فرض کنید که نیاز دارید شعاع را تایید کنید تا اطمینان حاصل شود که فقط اعداد مثبت ذخیره میشوند. چگونه این کار را بدون تغییر اینترفیس کلاس انجام میدهید؟ سریعترین روش برای حل این مشکل استفاده از یک property و پیادهسازی منطق ولیدیشن( اعتبارسنجی) در متد setter است.
import math
class Circle:
def __init__(self, radius):
self.radius = radius
@property
def radius(self):
return self._radius
@radius.setter
def radius(self, value):
if not isinstance(value, int | float) or value <= 0:
raise ValueError("positive number expected")
self._radius = value
def calculate_area(self):
return round(math.pi * self._radius**2, 2)
برای تبدیل اتریبیوت radius به یک پراپرتی، از دکوریتور property استفاده میکنیم یک متد getter بنویسیم. این متد هنگامی اجرا میشه که میخواهیم مقدار اتریبیوت radius رو مشاهده کنیم، پس قطعا باید مقدار شعاع رو به ما ریترن(return) کنه.
برای اینکه یک متد setter برای پراپرتی شعاع مون بنویسم از دکوریتور @ attr_name.setter استفاده میکنیم.
حال داخل متد setter میایم و منطق اعتبارسنجی که نیاز داشتیم رو پیاده میکنیم و اگر عدد طبق چیزی که انتظار داشتیم نبود به ما خطا میدهد در غیر این صورت در یک اتریبیوت non-public به نام _radius ذخیره میکنیم. حالا اتریبیوت radius ما تبدیل به یک پراپرتی شده و هرموقع که نیاز به مشاهده مقدار یا تغییر مقدار ان بودیم خود پایتون اتومات، ابتدا با توجه به عملیات یکی از متد های getter یا setter رو کال میکنه.
نحوه کارکرد اون به شکل زیر هست.
>>> from circle import Circle
>>> circle_1 = Circle(100)
>>> circle_1.radius
100
>>> circle_1.radius = 500
>>> circle_1.radius = 0
Traceback (most recent call last):
...
ValueError: positive number expected
>>> circle_2 = Circle(-100)
Traceback (most recent call last):
...
ValueError: positive number expected
>>> circle_3 = Circle("300")
Traceback (most recent call last):
...
ValueError: positive number expected
میبینید که با اتریبیوت radius دارید به طور عادی رفتار میکنید اما در پشت قضیه، یک رفتار متد مانند دارد و اگر مقدار نامعتبر دهید خطا میدهد.
منبع
#Property #Python
@Code_Crafters
❤2🔥1👏1
Descriptor
استفاده از descriptor ها هم یک روش قوی برای اضافه کردن رفتار متد مانند به یک اتریبیوت بدون تغییر دادن اینترفیس یک کلاس است. فرض کنید یک برنامه طراحی نوشتید و دو تا کلاس به نام های دایره و مربع دارید. میخواهیم عددی را به عنوان شعاع/ طول بگیریم و قبل ان چک کنیم که عدد حتما مثبت باشد. خب طبق چیزی که تا الان یاد گرفتیم میدانیم که با property میشود همین کار را انجام داد اما این کار باعث کد تکراری زدن میشود و خوب نیست پس از descriptor استفاده میکنیم.
با استفاده از descriptor کدی مانند زیر خواهیم داشت.
در قطعه کد بالا میبینیم که یک کلاس به نام PositiveNumber داریم.
این همان descriptor ما هست. سه داندر متد داره که به ترتیب به توضیح انها میپردازم.
متد اولی توسط پایتون به صورت اتومات هنگامی که از ان یک اینستنس بسازید صدا زده میشود و نام ان اینستنس هرچه که باشد به عنوان ارگومان name به متد پاس داده میشود. ارگومان owner هم نام کلاسی است که descriptor در ان استفاده شده است. ( در مثال ما Circle یا Square)
متد دوم همان متد getter و متد سوم هم همان متد setter همانند کاری که در پراپرتی انجام دادیم.
ارگومان instance که در دو متد getter,setter وجود داره درواقع همون اینستنسی هست که از کلاس Circle یا Square ما ساخته شده.
توجه داشته باشید که برای ذخیره یا مشاهده از اتریبیوت
این متد ها، اتومات توسط خود پایتون صدا زده میشوند.
حال در کلاس دایره خود، یک اتریبیوت کلاس به نام radius داریم که مقدارش، یک اینستنس از کلاس descriptor ما هست.
حال از این بعد هروقت بخواهیم مقداری در اتریبیوت radius ذخیره کنیم یا مقدار ان را مشاهده کنیم، بجای انکه پایتون از اتریبیوت
منبع
#Descriptor #Python
@Code_Crafters
استفاده از descriptor ها هم یک روش قوی برای اضافه کردن رفتار متد مانند به یک اتریبیوت بدون تغییر دادن اینترفیس یک کلاس است. فرض کنید یک برنامه طراحی نوشتید و دو تا کلاس به نام های دایره و مربع دارید. میخواهیم عددی را به عنوان شعاع/ طول بگیریم و قبل ان چک کنیم که عدد حتما مثبت باشد. خب طبق چیزی که تا الان یاد گرفتیم میدانیم که با property میشود همین کار را انجام داد اما این کار باعث کد تکراری زدن میشود و خوب نیست پس از descriptor استفاده میکنیم.
با استفاده از descriptor کدی مانند زیر خواهیم داشت.
import math
class PositiveNumber:
def __set_name__(self, owner, name):
self._name = name
def __get__(self, instance, owner):
return instance.__dict__[self._name]
def __set__(self, instance, value):
if not isinstance(value, int | float) or value <= 0:
raise ValueError("positive number expected")
instance.__dict__[self._name] = value
class Circle:
radius = PositiveNumber()
def __init__(self, radius):
self.radius = radius
def calculate_area(self):
return round(math.pi * self.radius**2, 2)
class Square:
side = PositiveNumber()
def __init__(self, side):
self.side = side
def calculate_area(self):
return round(self.side**2, 2)
در قطعه کد بالا میبینیم که یک کلاس به نام PositiveNumber داریم.
این همان descriptor ما هست. سه داندر متد داره که به ترتیب به توضیح انها میپردازم.
متد اولی توسط پایتون به صورت اتومات هنگامی که از ان یک اینستنس بسازید صدا زده میشود و نام ان اینستنس هرچه که باشد به عنوان ارگومان name به متد پاس داده میشود. ارگومان owner هم نام کلاسی است که descriptor در ان استفاده شده است. ( در مثال ما Circle یا Square)
متد دوم همان متد getter و متد سوم هم همان متد setter همانند کاری که در پراپرتی انجام دادیم.
ارگومان instance که در دو متد getter,setter وجود داره درواقع همون اینستنسی هست که از کلاس Circle یا Square ما ساخته شده.
توجه داشته باشید که برای ذخیره یا مشاهده از اتریبیوت
__dict__استفاده میکنیم که جلوتر متوجه علت ان خواهید شد.
این متد ها، اتومات توسط خود پایتون صدا زده میشوند.
حال در کلاس دایره خود، یک اتریبیوت کلاس به نام radius داریم که مقدارش، یک اینستنس از کلاس descriptor ما هست.
حال از این بعد هروقت بخواهیم مقداری در اتریبیوت radius ذخیره کنیم یا مقدار ان را مشاهده کنیم، بجای انکه پایتون از اتریبیوت
__dict__ان را بخواند یا ذخیره کند، متد های getter, setter از کلاس PositiveNumber با توجه به عملیات مورد نیاز صدا زده میشود و ارگومان های مورد نیاز پاس داده خواهد شد.
منبع
#Descriptor #Python
@Code_Crafters
👍4❤2👏1
فصل چهارم کتاب
ساخت بلوکهای همزمانی
همزمانی شامل تجزیه برنامه به واحدهای مستقل است، در فصول قبل سخت افزار رو بررسی کردیم و در سیستمهای مدرن برای همزمانی با استفاده از انتزاعی که سیستم عامل بر روی سخت افزار انجام میدهد میتوانیم همزمانی رو پیش ببریم، در این فصل به این موضوع میپردازیم که توسعه دهندگان برنامه خود را چطور با کمک سیستم عامل در استفاده بهینه از سخت افزار ساختار میدهند
مراحل برنامه نویسی همزمان
برنامه نویسی همزمان مجموعهای از انتزاعها است که به توسعه دهندگان این اجازه رو میده تا برنامه خودشون رو به وظابفی کوچک و مستقل ساختار داده و از طریق سیستم زمان اجرا (system runtime) جهت اجرا در صف انتقال دهند، سیستم زمان اجرا منابع رو برای استفاده بهینه هماهنگ کرده و وظایف رو برای اجرا در منابع ارسال میکند، دو انتزاع برای اینکار در همزمانی وجود دارد فرآیندها و رشتهها
فرایندها(processes)
فرآیند خود یک برنامه است که روی دیسک مینشیند یک مجموعه دستورالعملها رو نشون میده که منتظر اجرا هستند، سیستم عامل این دستورالعمل هارو میگیره به حالت اجرا میبره و به یک برنامه با ارزش تبدیل میکند
سورس کدها بجز یکسری دستورالعمل چیزی نیستند و بخودی خود هیچ ارزشی ندارن مگر اینکه اجرا شده و با انتزاع منابع عمل میکند
توسعه دهندگان هنگام نوشتن کد حافظهای رو برای ذخیره، فایلهایی جهت خواندن و نوشتن و سخت افزارهایی برای ارسال سیگنال به آنرا ندارند
منابع واقعی باید در زمان اجرا فراهم شوند، انتزاع ارائه شده توسط سیستم عامل برای یک برنامه در حال اجرا همان چیزیست که ما بهش فرآیند میگوییم
در سطح دستورالعمل ماشین هیچ مفهومی از فرآیند وجود ندارد
هدف از فرآیندها در سیستم عامل، جداسازی وظایف و تخصیص منابع جهت اجرای انهاست، تمام لرآیندها منابع مشترک دارند و توسط سیستم عامل مدیریت میشوند جهت اطلاع سیستم عامل از رابطه بین فرآیندها و منابع، هر فرآیند باید فضای آدرس مستقل و جدول فایل خود را داشته باشد
فرآیندها واحد تخصیص منابع در سیستم عامل هستند
سیستم عامل برای فرآیندها توهم مالکیت کامل رایانه رو ایجاد میکنند حتی اگر بطور همزمان اجرا شوند ،مزیت فرآیندها استقلال کامل و جداسازی اجرای انها از بقیه سیستم، جلوگیری از تداخل و عدم تاثیر گذاری خرابی یکی بر بقیه است
اما یک ضعف دارد اگر فرایندی نیاز به ارتباط با فرآیند دیگر داشته باشد ذاتا فرآیندها این رو ندارن و این موجب میشه از یکسری مکانیسم استفاده کنیم که معمولا چندین مرتبه از دسترسی مستقیم به دادهها کندتر است
نگاهی به درون فرآیند تصویر اول در کامنتها
فرایند فقط یک برنامه در حال اجرا است، که با دسترسی به سیستم
بنابراین، یک فرآیند چیزهای زیادی را در بر می گیرد: یک فایل اجرایی، مجموعه منابع مورد استفاده (فایل ها، اتصالات و غیره) و فضای آدرس با متغیرهای داخلی. به همه اینها زمینه اجرا می گویند. شروع فرآیند همیشه یک کار سنگین بوده است
یک فرآیند میتواند فرآیندهای خود را اجرا کند که به آنها فرآیندها فرزند میگویند و کامل مستقل هستند حافظه و و فضای نام خود را دارند تصویر دوم در کامنتها
درک این موضوع در کد راحتتر از تئوری آن است کدهای فرآیند در کامنتها
لینک وبسایت
#concurrency
@code_crafters
ساخت بلوکهای همزمانی
همزمانی شامل تجزیه برنامه به واحدهای مستقل است، در فصول قبل سخت افزار رو بررسی کردیم و در سیستمهای مدرن برای همزمانی با استفاده از انتزاعی که سیستم عامل بر روی سخت افزار انجام میدهد میتوانیم همزمانی رو پیش ببریم، در این فصل به این موضوع میپردازیم که توسعه دهندگان برنامه خود را چطور با کمک سیستم عامل در استفاده بهینه از سخت افزار ساختار میدهند
مراحل برنامه نویسی همزمان
برنامه نویسی همزمان مجموعهای از انتزاعها است که به توسعه دهندگان این اجازه رو میده تا برنامه خودشون رو به وظابفی کوچک و مستقل ساختار داده و از طریق سیستم زمان اجرا (system runtime) جهت اجرا در صف انتقال دهند، سیستم زمان اجرا منابع رو برای استفاده بهینه هماهنگ کرده و وظایف رو برای اجرا در منابع ارسال میکند، دو انتزاع برای اینکار در همزمانی وجود دارد فرآیندها و رشتهها
فرایندها(processes)
فرآیند خود یک برنامه است که روی دیسک مینشیند یک مجموعه دستورالعملها رو نشون میده که منتظر اجرا هستند، سیستم عامل این دستورالعمل هارو میگیره به حالت اجرا میبره و به یک برنامه با ارزش تبدیل میکند
سورس کدها بجز یکسری دستورالعمل چیزی نیستند و بخودی خود هیچ ارزشی ندارن مگر اینکه اجرا شده و با انتزاع منابع عمل میکند
توسعه دهندگان هنگام نوشتن کد حافظهای رو برای ذخیره، فایلهایی جهت خواندن و نوشتن و سخت افزارهایی برای ارسال سیگنال به آنرا ندارند
منابع واقعی باید در زمان اجرا فراهم شوند، انتزاع ارائه شده توسط سیستم عامل برای یک برنامه در حال اجرا همان چیزیست که ما بهش فرآیند میگوییم
در سطح دستورالعمل ماشین هیچ مفهومی از فرآیند وجود ندارد
هدف از فرآیندها در سیستم عامل، جداسازی وظایف و تخصیص منابع جهت اجرای انهاست، تمام لرآیندها منابع مشترک دارند و توسط سیستم عامل مدیریت میشوند جهت اطلاع سیستم عامل از رابطه بین فرآیندها و منابع، هر فرآیند باید فضای آدرس مستقل و جدول فایل خود را داشته باشد
فرآیندها واحد تخصیص منابع در سیستم عامل هستند
سیستم عامل برای فرآیندها توهم مالکیت کامل رایانه رو ایجاد میکنند حتی اگر بطور همزمان اجرا شوند ،مزیت فرآیندها استقلال کامل و جداسازی اجرای انها از بقیه سیستم، جلوگیری از تداخل و عدم تاثیر گذاری خرابی یکی بر بقیه است
اما یک ضعف دارد اگر فرایندی نیاز به ارتباط با فرآیند دیگر داشته باشد ذاتا فرآیندها این رو ندارن و این موجب میشه از یکسری مکانیسم استفاده کنیم که معمولا چندین مرتبه از دسترسی مستقیم به دادهها کندتر است
نگاهی به درون فرآیند تصویر اول در کامنتها
فرایند فقط یک برنامه در حال اجرا است، که با دسترسی به سیستم
داده هایی که فرآیند می خواند یا می نویسد در حافظه ذخیره می شود. بنابراین، حافظه ای که فرآیند می تواند ببیند یا به آن دسترسی داشته باشد (فضای آدرس) بخشی از فرآیند در حال اجرا است.
• فایل اجرایی با تمام دستورالعمل های ماشین بخشی از فرآیند است.
• فرآیند همچنین به یک شناسه نیاز دارد: یک نام منحصر به فرد که فرآیند را می توان با آن شناسایی کرد. به آن شناسه فرآیند (PID) می گویند.
• در نهایت، برنامه ها اغلب به دیسک ها، منابع شبکه یا سایر دستگاه های شخص ثالث دسترسی دارند. چنین اطلاعاتی باید شامل فهرستی از فایلهایی باشد که در حال حاضر توسط فرآیند باز میشوند، اتصالات شبکه باز و هرگونه اطلاعات اضافی درباره منابعی که استفاده میکند.
بنابراین، یک فرآیند چیزهای زیادی را در بر می گیرد: یک فایل اجرایی، مجموعه منابع مورد استفاده (فایل ها، اتصالات و غیره) و فضای آدرس با متغیرهای داخلی. به همه اینها زمینه اجرا می گویند. شروع فرآیند همیشه یک کار سنگین بوده است
فرآیندها معمولاً توسط سیستم عامل ایجاد می شوند. علاوه بر ایجاد فرآیندها، سیستم عامل مسئولیت خاتمه فرآیند را نیز بر عهده دارد. این یک کار پیش پا افتاده نیست. سیستم عامل باید بفهمد که فرآیند به پایان رسیده است - یا کار کامل شده است، فرآیند ناموفق است و زمان پاکسازی آن فرا رسیده است، یا فرآیند والد تمام شده است. ایجاد یا خاتمه یک فرآیند نسبتاً پرهزینه است زیرا همانطور که دیدیم، یک فرآیند منابع زیادی به آن متصل است و باید ایجاد یا آزاد شوند. انجام این کار به زمان سیستم نیاز دارد و تاخیر اضافی را معرفی می کند.
یک فرآیند میتواند فرآیندهای خود را اجرا کند که به آنها فرآیندها فرزند میگویند و کامل مستقل هستند حافظه و و فضای نام خود را دارند تصویر دوم در کامنتها
درک این موضوع در کد راحتتر از تئوری آن است کدهای فرآیند در کامنتها
لینک وبسایت
#concurrency
@code_crafters
رشتهها threads
اشتراک گذاری حافظه بین فرآیندها در اکثر سیستم عامل ها امکان پذیر است، اما به موارد اضافی نیاز دارد که تلاش بیشتری طلب میکند، اما یک مفهوم دیگر که در اشتراک حافظه یک بیت بیشتر به ما کمک میکند وحود دارد:رشته
یک برنامه به سادگی مجموعه ای از دستورالعمل های ماشین است که باید پشت سر هم اجرا شوند برای تحقق این امر سیستم عامل از مفهوم رشته استفاده میکند
رشتهها با این ایده متولد شدن که کارآمدترین راه برای اشتراک گذاری فضای ادرس مشترک هستند تصویر اول در کامنتها
رشتهها در یک فرآیند واحد، مانند فرآیندهایی هستند که میتوانند به راحتی منابع را با یکدیگر و فرآیند اصلی خود به اشتراک بگذارند
رشتهها وضعیت خود را حفظ میکنند تا مستقل از بقیه اجرا شوند، همچنین رشتهها از حضور بقیه رشتهها بی اطلاع هستند مگر اینکه باهم تداخلی داشته باشند
سیستم عامل رشتهها رو مدیریت میکند و میتواند بین چند پردازنده آنها را اجرا کند بنابراین رشتهها گزینه خوبی برای اجرای همزمانی هستند
مزایای استفاده از رشتهها نسبت به فرآیندها
ضعف رشتهها
فرایندها در سطح سیستم عامل کاملا مستقل از همدیگه هستند، در صورت خراب شدن یکی بر دیگری تاثیری نمیگذارد، اما رشتهها چون در یک فرآیند اجرا میشوند در صورت خرابی یکی ممکنه موجب خرابی بقیه هم بشه، لذا برنامه نویسان باید در دسترسی به منابع بین رشتهها همگام سازی کنند و کنترل بیشتری بر رفتار آنها اعمال کنند
کد رشتهها در کامنت
لینک وبسایت
#concurrency
@code_crafters
اشتراک گذاری حافظه بین فرآیندها در اکثر سیستم عامل ها امکان پذیر است، اما به موارد اضافی نیاز دارد که تلاش بیشتری طلب میکند، اما یک مفهوم دیگر که در اشتراک حافظه یک بیت بیشتر به ما کمک میکند وحود دارد:رشته
یک برنامه به سادگی مجموعه ای از دستورالعمل های ماشین است که باید پشت سر هم اجرا شوند برای تحقق این امر سیستم عامل از مفهوم رشته استفاده میکند
گفتیم یک فرآیند یک برنامه در حال اجرا به اضافه منابع است، اگر برنامه را به اجزای جداگانه تقسیم کنیم، یک فرآیند محفظه ای از منابع (فضای آدرس، فایل ها، اتصالات و غیره) است و یک رشته یک بخش پویا است - دنباله ای از دستورالعمل ها که در داخل این ظرف اجرا می شوند. بنابراین، در زمینه سیستم عامل، یک فرآیند را می توان به عنوان واحدی از منابع در نظر گرفت، در حالی که یک رشته را می توان به عنوان واحد اجرا مشاهده کرد
رشتهها با این ایده متولد شدن که کارآمدترین راه برای اشتراک گذاری فضای ادرس مشترک هستند تصویر اول در کامنتها
رشتهها در یک فرآیند واحد، مانند فرآیندهایی هستند که میتوانند به راحتی منابع را با یکدیگر و فرآیند اصلی خود به اشتراک بگذارند
رشتهها وضعیت خود را حفظ میکنند تا مستقل از بقیه اجرا شوند، همچنین رشتهها از حضور بقیه رشتهها بی اطلاع هستند مگر اینکه باهم تداخلی داشته باشند
سیستم عامل رشتهها رو مدیریت میکند و میتواند بین چند پردازنده آنها را اجرا کند بنابراین رشتهها گزینه خوبی برای اجرای همزمانی هستند
اکثر سازندگان سخت افزار از Pthreads استفاده می کنند، که یک استادارد IEEE می باشد
در این استاندارد، هر برنامه ای که اجرا می کنیم باعث می شود سیستم عامل یک فرآیند ایجاد کند و هر فرآیند حداقل یک رشته دارد. یک فرآیند بدون رشته نمی تواند وجود داشته باشد. هر رشته همچنین زمینه اجرای مستقل خود را حفظ می کند تا اطمینان حاصل شود که دستورالعمل های آن به طور ایمن و مستقل اجرا می شوند
مزایای استفاده از رشتهها نسبت به فرآیندها
۱: فرآیندها کاملاً مستقل هستند، هر کدام دارای فضای آدرس، مجموعهای از رشتهها و کپیهایی از متغیرها هستند که کاملاً مستقل از همان متغیرها در سایر فرآیندها هستند رشته ها نسبت به عملکرد استاندارد fork() سربار حافظه کمتری دارند زیرا رشته والد کپی نمی شود رشته ها از همان فرآیند استفاده می کنند.به همین دلیل، رشته ها را گاهی اوقات فرآیندهای سبک وزن نیز می نامند
در نتیجه، ما میتوانیم رشتههای بیشتری نسبت به فرآیندهای روی یک سیستم ایجاد کنیم
ایجاد و پایان دادن به رشته ها سریعتر از فرآیندها است زیرا زمان کمتری را برای سیستم عامل برای تخصیص و مدیریت منابع نخ نیاز دارد.به همین دلیل، میتوانیم هر زمان که در برنامهای منطقی بود، رشتههایی ایجاد کنیم و نگران اتلاف زمان و حافظه پردازنده نباشیم
۲: هزینه ارتباط کمتر، هر فرآیند با حافظه خاص خود کار می کند.فرآیندها فقط می توانند چیزی را از طریق یک مکانیسم ارتباطی فرآیندی مبادله کنند
رشتهها از فضای آدرس یکسانی استفاده میکنند و بنابراین میتوانند با نوشتن و خواندن در فضای آدرس مشترک فرآیند والد خود بدون هیچ مشکلی یا سربار با یکدیگر ارتباط برقرار کنند: هر چیزی که توسط یک رشته تغییر کند بلافاصله در دسترس همه است
از این رو، برای سیستم های SMP که به طور گسترده مورد استفاده قرار می گیرند، گاهی اوقات استفاده از رشته ها بسیار راحت تر از فرآیندها است
ضعف رشتهها
فرایندها در سطح سیستم عامل کاملا مستقل از همدیگه هستند، در صورت خراب شدن یکی بر دیگری تاثیری نمیگذارد، اما رشتهها چون در یک فرآیند اجرا میشوند در صورت خرابی یکی ممکنه موجب خرابی بقیه هم بشه، لذا برنامه نویسان باید در دسترسی به منابع بین رشتهها همگام سازی کنند و کنترل بیشتری بر رفتار آنها اعمال کنند
کد رشتهها در کامنت
لینک وبسایت
#concurrency
@code_crafters
وقتی رو شغلش و تخصصش کراش میزنی
سوا ازینها گذشته هر آدمی رابطه مستقیمی با الانش داره، بابت همین بشدت موضوع مهمی هستش که مدام و مدام راجب داشتن سابقه تو هر استخدامی میپرسن😅😅😅😅😅
مثلا کسی که سابقه کار با php رو داشته باشه قطعا واسه پایتون خوب نیست یا سابقه فرانت شما برای بکند فقط افتضاح ببار میاره
#fun
@code_crafters
سوا ازینها گذشته هر آدمی رابطه مستقیمی با الانش داره، بابت همین بشدت موضوع مهمی هستش که مدام و مدام راجب داشتن سابقه تو هر استخدامی میپرسن😅😅😅😅😅
مثلا کسی که سابقه کار با php رو داشته باشه قطعا واسه پایتون خوب نیست یا سابقه فرانت شما برای بکند فقط افتضاح ببار میاره
#fun
@code_crafters
😁6👍2👎2
دوستان داریم یک مقدار سایت رو توسعه میدیم
و ازین ببعد مطالب حجیم رو در سایت میزاریم فقط و لینک رو در کانال براتون قرار میدیم
حدود ده نفر از دوستان در حال ترجمه و تبدیل مقالات سایت real python هستند و این مطالب هم در سایت براتون میزاریم و بخشی رو براش جدا میکنیم
خلاصه کتاب همزمانی رو هم در سایت میزارم براتون ازین ببعد (اینجوری یکم سرعتم بیشتر میشه بابت خلاصه نوشتن کتاب و لازم نیست دو نسخه مناسب تلگرام و سایت ازش بسازم )
و احتمال زیاد یک کتاب دیگه در خصوص میکروسرویس در پایتون و جنگو رو هم مدنظر دارم براتون ترجمه کنم ،اول باید کتاب رو بررسی کنم خودم ببینم مطالبش چی هست
دوستانی هم که تمایل دارن به همکاری کردن که در کنار هم یاد بگیریم و پیش بریم پیام بدین
هدف ما ساخت یک کامیونیتی فعال خود یادگیرنده هستش تو این مسیر من بهتون کمک میکنم
@code_crafters
و ازین ببعد مطالب حجیم رو در سایت میزاریم فقط و لینک رو در کانال براتون قرار میدیم
حدود ده نفر از دوستان در حال ترجمه و تبدیل مقالات سایت real python هستند و این مطالب هم در سایت براتون میزاریم و بخشی رو براش جدا میکنیم
خلاصه کتاب همزمانی رو هم در سایت میزارم براتون ازین ببعد (اینجوری یکم سرعتم بیشتر میشه بابت خلاصه نوشتن کتاب و لازم نیست دو نسخه مناسب تلگرام و سایت ازش بسازم )
و احتمال زیاد یک کتاب دیگه در خصوص میکروسرویس در پایتون و جنگو رو هم مدنظر دارم براتون ترجمه کنم ،اول باید کتاب رو بررسی کنم خودم ببینم مطالبش چی هست
دوستانی هم که تمایل دارن به همکاری کردن که در کنار هم یاد بگیریم و پیش بریم پیام بدین
هدف ما ساخت یک کامیونیتی فعال خود یادگیرنده هستش تو این مسیر من بهتون کمک میکنم
@code_crafters
👍14🔥3
در خصوص میکروسرویس این کتاب رو باهم پیش میریم
چندتا نکته بهتون بگم راجبش:
خود کتاب بسیار روان و شیوا هست حیلی راحت میتونید کتاب رو بردارید و بخونید، منتها نویسندگان کتاب در ساختار جمله بندی و طراحی دقیق پاراگرافهاش بشدت کم کاری کردن که یک مقدار گیج کننده میشه برامون
دو فصل اول کتاب راجب پایتون و شی گرایی هست که از ترجمه خلاصه اون سر باز میزنیم که خب همه باید بلد باشین چون بیس یادگیری جنگو هستش
فصل سوم هم پایههای جنگو هست و چون مطالب جالبی داخلش مطرح شده بود ترجمه میکنیم
مورد بعدی اینکه میکروسرویس خیلی بزرگتر ازون چیزی هست که بخوایم در یک کتاب یاد بگیریمش و جا داده بشه پس طبیعیه تو این کتاب هم فقط بخشی ازون رو بررسی کنیم
کتابهای دیگه هم هستن که با خوندنشون درک ما از پایههای خود میکروسرویس بیشتر میشه که حالا باید ببینم برنامهم بعد از این کتابها چی خواهد بود و اگر فرصتی شد یک کتاب هم در این خصوص خلاصه میکنیم
#book
@code_crafters
چندتا نکته بهتون بگم راجبش:
خود کتاب بسیار روان و شیوا هست حیلی راحت میتونید کتاب رو بردارید و بخونید، منتها نویسندگان کتاب در ساختار جمله بندی و طراحی دقیق پاراگرافهاش بشدت کم کاری کردن که یک مقدار گیج کننده میشه برامون
دو فصل اول کتاب راجب پایتون و شی گرایی هست که از ترجمه خلاصه اون سر باز میزنیم که خب همه باید بلد باشین چون بیس یادگیری جنگو هستش
فصل سوم هم پایههای جنگو هست و چون مطالب جالبی داخلش مطرح شده بود ترجمه میکنیم
مورد بعدی اینکه میکروسرویس خیلی بزرگتر ازون چیزی هست که بخوایم در یک کتاب یاد بگیریمش و جا داده بشه پس طبیعیه تو این کتاب هم فقط بخشی ازون رو بررسی کنیم
کتابهای دیگه هم هستن که با خوندنشون درک ما از پایههای خود میکروسرویس بیشتر میشه که حالا باید ببینم برنامهم بعد از این کتابها چی خواهد بود و اگر فرصتی شد یک کتاب هم در این خصوص خلاصه میکنیم
#book
@code_crafters
❤8👍2
🎙 سری پادکستهای توسعه چابک (Agile)
☁️ ممنون میشم نظراتتون رو بشنوم که استفاده کنیم.
✔️ ویس بعد راجب اجایل در ایران و فریمورکهای اجایل صحبت میکنیم.
آیدی بنده:
@AminAlih47
#agile
@code_crafters
☁️ ممنون میشم نظراتتون رو بشنوم که استفاده کنیم.
✔️ ویس بعد راجب اجایل در ایران و فریمورکهای اجایل صحبت میکنیم.
آیدی بنده:
@AminAlih47
#agile
@code_crafters
👏4👍1
🎙 قسمت دوم سری پادکستهای توسعه چابک
✅ توی این ویس یکم بیشتر راجب اجایل صحبت میکنیم و بعدش هم میپردازیم به اجایل در ایران و فریمورکهای اجایل
☁️ ممنون میشم نظراتتون رو بشنوم که استفاده کنیم.
✔️ ویس بعد راجب فریمورک اسکرام صحبت خواهیم کرد. (تا آخر هفته منتشر میشه)
آیدی بنده:
@AminAlih47
#agile
@code_crafters
✅ توی این ویس یکم بیشتر راجب اجایل صحبت میکنیم و بعدش هم میپردازیم به اجایل در ایران و فریمورکهای اجایل
☁️ ممنون میشم نظراتتون رو بشنوم که استفاده کنیم.
✔️ ویس بعد راجب فریمورک اسکرام صحبت خواهیم کرد. (تا آخر هفته منتشر میشه)
آیدی بنده:
@AminAlih47
#agile
@code_crafters
❤3