برنامه نویسی

نحوه کانتینریزه کردن جنگو در حال توسعه – از طریق docker compose

متن نوشته

اغلب مشکلی در توسعه وجود دارد که خطایی وجود دارد که فقط در یک دستگاه ظاهر می شود.

روی میم دستگاه من کار می کند

این اغلب به این دلیل است که نسخه‌ها و/یا کتابخانه‌های مختلف برنامه در محیط‌های توسعه مختلف نصب شده‌اند.

توسعه دهنده A:
PostgreSQL 14.6
پایتون 3.7.11
Redis 7.4.2

توسعه دهنده B:
PostgreSQL 14.6
پایتون 3.9.11
Redis 7.4.2

حال، اگر اشکالی در پایتون 3.7.11 ظاهر شود اما در پایتون 3.9.11 ظاهر نمی شود – فقط توسعه دهنده A تحت تأثیر قرار می گیرد.
با این حال، معمولاً زمان زیادی طول می کشد تا متوجه شوید که این اشکال از تفاوت نسخه ها ناشی می شود. بنابراین بلافاصله مشخص نیست که این اشکال به دلیل نسخه های مختلف رخ می دهد. حفظ همه نسخه ها و کتابخانه ها یکسان برای همه توسعه دهندگان دشوار یا غیرممکن/بی معنی است.
علاوه بر این، اغلب اوقات این اتفاق می افتد که توسعه دهندگان جدید همیشه باید از نظر فنی راه اندازی شوند. این گاهی اوقات می تواند به معنای چند روز کار باشد به طوری که فقط یک نفر می تواند همه چیز را در شرایط “کار” قرار دهد.
اینجاست که docker compose & containerization وارد عمل می شود. به منظور اجتناب از نسخه های مختلف برنامه و کتابخانه و همچنین برای ساده سازی فرآیند نصب فنی، در اینجا موارد زیادی امکان پذیر است. با کمی دانش از DevOps می توانید docker-compose.yml & Dockerfile فایل ها را تنظیم کنید و بنابراین کل برنامه را با تمام نسخه ها تنظیم کنید. اکنون تنها کاری که توسعه دهندگان باید انجام دهند این است که Docker را روی رایانه شخصی/مک خود داشته باشند و داکر بقیه موارد را بر عهده خواهد گرفت.

مکان‌های Dockerfile و .yml

بهتر است مال خود را بگذارید Dockerfile و docker-compose.yml به نحوی که برای اپلیکیشن شما منطقی باشد. برای من که همینطوره docker-compose.yml در سطح مخزن و Dockerfile در سطح پروژه جنگو قرار دارد. به این ترتیب می توانم برنامه خود را مستقیماً هنگامی که به مخزن می روم راه اندازی کنم. علاوه بر این، بخش‌های بیشتری از برنامه را می‌توان در سطح مخزن اضافه کرد. مانند سایر برنامه های وب یا پایگاه های داده و غیره.

- meine_repository
    - docker-compose.yml
    - mein_django_projekt/
        - Dockerfile
        - manage.py
        - ...
    - venv/
    - .env
    - .gitignore
    - README.md
وارد حالت تمام صفحه شوید

از حالت تمام صفحه خارج شوید

Dockerfile

برای شروع برنامه جنگو در کانتینر، به یک Dockerfile نیاز دارید. در اینجا جزئیات رفتار برنامه خود را در ظرف تعیین می کنید. اینم Dockerfile من برای جنگو با توضیحات:

# Deine Python-Version gibst du mit Doppelpunkt und der Versionsnummer mit 2 Punkten an.
# So verhinderst du mögliche Probleme mit falschen Versionen
FROM python:3.11.9

# Drei nützliche Optionen für die Python runtime im Container. 
# https://stackoverflow.com/questions/59812009/what-is-the-use-of-pythonunbuffered-in-docker-file
ENV PYTHONUNBUFFERED 1
# https://stackoverflow.com/questions/59732335/is-there-any-disadvantage-in-using-pythondontwritebytecode-in-docker
ENV PYTHONDONTWRITEBYTECODE 1
# https://stackoverflow.com/questions/45594707/what-is-pips-no-cache-dir-good-for
ENV PIP_NO_CACHE_DIR=1

# Du kannst als dein 'Hauptverzeichnis' im Container einfach /app nutzen
# Das 'WORKDIR' wirkt sich auf alle weiteren Docker - Befehle aus, wie z.B.
# den COPY Befehl in der nächsten Zeile. Mit . ist jetzt /app gemeint
WORKDIR /app

# Hiermit kopierst du deine requirements.txt nach /app/requirements.txt
# Dazu muss sich dein requirements.txt in deinem Django-Projektverzeichnis befinden
COPY requirements.txt .

# Jetzt installierst du die requirements.txt
RUN pip install -r requirements.txt

# Du kopierst nun dein gesamtes django-Projekt in den Container
COPY . .

# Gebe deinen Port im Docker-Netzwerk frei
EXPOSE 8000
وارد حالت تمام صفحه شوید

از حالت تمام صفحه خارج شوید

اکنون می توانید تصویر کانتینر خود را بسازید و اجرا کنید:

cd mein_projekt
docker build -t mein_container_image .

# Hier sollte nichts passieren
docker run mein_container_image
وارد حالت تمام صفحه شوید

از حالت تمام صفحه خارج شوید

چرا هیچ اتفاقی نمی افتد؟ ظرف شما فقط برای مدت کوتاهی کار می کند زیرا شما python manage.py runserver هنوز دستور ندادی! این کاری است که ما اکنون انجام می دهیم.

docker-compose.yml

ما ارکستراسیون ظرف شما را از این طریق انجام می دهیم docker-compose.yml. در حال حاضر شما فقط به یک سرویس نیاز دارید، اما در آینده می توانید چندین سرویس دیگر اضافه کنید. در اینجا این است که چگونه می توانید کارهای خود را انجام دهید docker-compose.yml ساختن:

services:
  meine_app:
    # Automatischer Neustart, falls deine App abstürzt
    restart: always
    # Das Verzeichnis, in dem dein Dockerfile liegt
    build: ./mein_django_projekt
    # Du gibst den Port 8000 frei vom Inneren des Containers zum Äußeren
    ports:
      - "8000:8000"
    # Mit einem Bind-Mount sorgst du dafür, dass der Code deines Projekts
    # Im Container aktualisiert wird, so wie auf deiner Festplatte
    volumes:
      - ./mein_django_projekt/:/app
    # Hier kannst du deine Umgebung angeben:
    env_file: .env
    # Mit diesem Befehl startest du den Server
    # Bei Containern mit 0.0.0.0 starten!
    command: python manage.py runserver 0.0.0.0:8000
وارد حالت تمام صفحه شوید

از حالت تمام صفحه خارج شوید

اکنون می توانید برنامه خود را راه اندازی کنید!
با docker compose up کانتینر شما اکنون ساخته شده و با دستور runserver شروع می شود. دستور باید در همان دایرکتوری باشد docker-compose.yml فایل قابل ارسال است
حالا شما می توانید زیر localhost:8000 به برنامه خود برسید!

کد نویسی مبارک!
مال شما، روبن

وبلاگ من

نوشته های مشابه

دیدگاهتان را بنویسید

نشانی ایمیل شما منتشر نخواهد شد. بخش‌های موردنیاز علامت‌گذاری شده‌اند *

دکمه بازگشت به بالا