داکر برای برنامه‌نویس‌ها: قسمت نهم - جنگو در داکرفایل

مقدمه

قسمت قبلی یک داکرفایل ساده نوشتیم و از روش ایمیج درست کردیم. این دفعه قراره یک برنامه پایتون که با فریم‌ورک جنگو نوشته شده رو داکرایز و اجرا کنیم. این مطلب برای برنامه‌نویس‌هایی که می‌خوان برنامه‌هاشون رو در داکر اجرا کنن مفید خواهد بود.

برای دنبال کردن مطالب این قسمت باید با داکر و اجرا کردن کانتینر در اون آشنا باشید. هم‌چنین خوبه که آشنایی ابتدایی با نوشتن داکرفایل و دستورات خط فرمان لینوکس داشته باشید.


معرفی برنامه

من یک برنامه با جنگو نوشتم که می‌تونید اون رو تو این لینک گیتهاب ببینید و اگه خواستید کلون کنید. به برنچ simple-app برید. البته در زمان نوشتن این متن master با simple-app فرقی ندارن ولی در آینده تغییر می‌کنن. داکرفایلش رو هم همونجا می‌بینید که می‌خوایم در موردش صحبت کنیم. این برنامه وقتی اجرا بشه به درخواست‌های http ما جواب میده. چند تا جدول داره داخل دیتابیس که برای نویسنده و بلاگ هست. یک سری پارامتر هم داره که موقع اجرای برنامه از متغیرهای محیطی می‌خونه. از جمله اطلاعات ادمین. داخل فایل start.sh دستوراتی هست که برنامه رو اجرا می‌کنه و روی پورت ۸۰۰۰ گوش میده.


نوشتن داکرفایل

FROM python:3.7
ENV PYTHONUNBUFFERED 1
RUN mkdir /code
WORKDIR /code
COPY requirements.txt /code/
RUN pip install -r requirements.txt
COPY . /code/
ENTRYPOINT [&quot/bin/bash&quot, &quotstart.sh&quot]

اولش که قرار شد اسم ایمیج پایه رو بنویسیم. من از python:3.7 استفاده کردم. بعدش با ENV مقدار یک متغیر محیطی به نام PYTHONUNBUFFERED رو 1 گذاشتم که وقتی کانتینر اجرا شد لاگ‌ها رو بافر نکنه و تو خروجی استاندارد بنویسه. می‌تونستم موقع اجرا هم این متغیر رو بدم ولی چون می‌خوام تو همه‌ی کانتینرها باشه اینجا نوشتم.

می‌خوام کدهای برنامه رو در مسیر code/ کپی کنم. اول این پوشه رو با RUN می‌سازم. با RUN یک دستور رو هنگام بیلد ایمیج داخل اون اجرا می‌کنیم. کلمه WORKDIR رو دیده بودیم. پوشه در مسیر code/ رو در نظر گرفتم تا از این به بعد اونجا باشیم.

بعدش در دو مرحله فایل‌ها رو کپی می‌کنیم. دلیلش رو ان شاء الله قسمت بعد می‌بینیم. دستور COPY رو دیده بودیم قبلا. اول فایلی که requirement های برنامه رو داره منتقل می‌کنم و از روی اون با کمک RUN ماژول‌های لازم نصب میشه. دستوری که اجرا کردم pip هست و برای نصب پکیج‌های پایتون استفاده میشه. وقتی docker build رو اجرا کنم پکیج‌های لازم روی ایمیج نصب شده و هر جا که از روی اون کانتینری رو اجرا کنم این پکیج‌ها رو خواهم داشت. در بخش دوم سورس کد رو منتقل می‌کنم به پوشه اصلی. الان دیگه همه چیز رفته داخل ایمیج.

آخرین کاری که انجام میدم اینه که اسکریپت start.sh رو اجرا کنم. با استفاده از ENTRYPOINT این کار رو تو بش انجام میدم. جلوش داخل یک آرایه دستور رو میدم. هر جا قرار باشه فاصله بذارم یا یه آپشن جدید از دستور رو بنویسم یه عنصر جدید به آرایه اضافه می‌کنم. ترتیب هم طبییعتا مهمه. حالا داکرفایل آماده است. بریم که بیلد و اجراش کنیم.


بیلد ایمیج و اجرای کانتینر

با دستور docker build داخل پوشه‌ای که داکرفایل هست بیلد رو شروع می‌کنم:

با t- نام و تگ ایمیج رو میدم و بعد نقطه گذاشتم که یعنی پوشه اصلی همینجاست. دقت کنید فرایند بیلد مرحله به مرحله است و هر مرحله روی بعدی میاد. این نکته‌ی مهمی هست که ایشالا بعدا بهش می‌پردازیم.

خب الان از روی ایمیج کانتینر می‌سازم (پورت رو یادتون نره):

و با کمک curl بهش درخواست REST میدم (درخواست‌های نمونه رو در فایل curl.sh می‌تونید ببینید):

هورااا...

می‌بینم که کارم درست شده و کانتینر کار میکنه. با این درخواست یک کاربر جدید ثبت‌نام کردم و توکن گرفتم. دقت کنید مقدار متغیر PORT رو همون مقداری بذارید که موقع اجرای کانتینر پابلیش کردید.


جمع بندی

در این قسمت یک برنامه پایتون که با فریم‌ورک جنگو نوشته شده رو داکرایز کردیم، از روش ایمیج ساختیم و اجراش کردیم. در نهایت برای اطمینان از عملکردش یک درخواست دادیم و جواب گرفتیم. امیدوارم این نوشته براتون مفید بوده باشه. اگر نظر یا سوالی دارید این پایین بفرمایید.

قسمت قبلی

قسمت بعدی