سب کو سلام. ہم آپ کے پروجیکٹ کو لکھنے پر مضامین کا سلسلہ جاری رکھتے ہیں۔
شاخوں کو ترتیب دیں۔
اہمیت کی بات یہ ہے کہ شاخوں میں گم نہ ہونے کے لیے اور ذخیرہ میں ان کی ترتیب، میں نے STEP_{number} کا سابقہ شامل کرکے ان کا نام تبدیل کرنے کا فیصلہ کیا ۔ مثال کے طور پر، ہمارے پاس اہم کے علاوہ تین شاخیں ہیں:- JRTB-0
- JRTB-2
- JRTB-3
- STEP_1_JRTB-0 - پہلا قدم
- STEP_2_JRTB-2 - دوسرا مرحلہ
- STEP_3_JRTB-3 - تیسرا مرحلہ
ڈوکر کے بارے میں تھوڑا سا
Docker کیا ہے؟ مختصراً، یہ ایک ایسا ٹول ہے جس کی مدد سے آپ ایپلیکیشنز کو تیزی سے اور محفوظ طریقے سے تعینات (تعینات) کر سکتے ہیں، ان کے لیے ایک بند انفراسٹرکچر بنا سکتے ہیں، جو صرف ان کے لیے ضروری ہے۔ یہ اب بھی مشکل ہے، میں سمجھتا ہوں۔ عام طور پر، Docker کو ایک ترقیاتی پلیٹ فارم کے طور پر سمجھا جا سکتا ہے جہاں آپ تیزی سے اور مؤثر طریقے سے کام کر سکتے ہیں۔ ڈوکر کو ایک ایسے پروگرام کے طور پر سمجھا جا سکتا ہے جو سرور پر چلتا ہے۔ یہ پروگرام ایپلی کیشنز کے ساتھ کنٹینرز کو ذخیرہ کرنے کی صلاحیت رکھتا ہے۔ کنٹینر کیا ہے؟ یہ ایک علیحدہ انفراسٹرکچر ہے جس میں آپ اپنی ضرورت کی ہر چیز شامل کر سکتے ہیں۔ مثال کے طور پر، جاوا ایپلی کیشن کے لیے ہمیں ایپلیکیشن چلانے کے لیے JRE کی ضرورت ہے، کنٹینر میں یہ ہوگا، ہمیں کسی اور سافٹ ویئر کی ضرورت ہوگی - ہم اسے شامل کرسکتے ہیں۔ یا ہوسکتا ہے کہ ہمیں لینکس اور ٹامکیٹ سرولیٹ کنٹینر کی ضرورت ہو۔ یہ بھی کیا جا سکتا ہے۔ کنٹینرز تصویر کی بنیاد پر بنائے جاتے ہیں: یعنی یہ ایک مخصوص ٹیمپلیٹ ہے جس میں ڈوکر کنٹینر بنانے کے لیے ضروری سب کچھ لکھا جاتا ہے۔ یہ تصویر کیسے بنائی جائے؟ ہمارے معاملے میں، ہمیں پروجیکٹ کی جڑ میں ایک Dockerfile بنانے کی ضرورت ہوگی جس میں یہ بتایا جائے کہ کنٹینر میں کیا ہونا چاہیے۔ چونکہ ہم بوٹ کے ٹوکن کو کہیں بھی ظاہر نہیں کرنا چاہتے ہیں، اس لیے جب بھی ہم ایپلیکیشن کو تعینات کرنا چاہیں گے ہمیں اسے پاس کرنے کا سہارا لینا پڑے گا۔ آپ یہاں اور یہاں اس موضوع کے بارے میں مزید پڑھ سکتے ہیں ۔ہم JRTB-13 لکھتے ہیں۔
ہمیں سرور پر اپنی درخواست کے لیے ایک تیز اور آسان تعیناتی کا عمل ترتیب دینے کی ضرورت ہے۔ یعنی ایک مشین کے لیے جو 24/7 کام کرتی ہے۔ آئیے ڈوکر کو ایک بنیاد کے طور پر لیں۔ لیکن ہماری فہرست میں کوئی ایسا کام نہیں ہے جو اس فعالیت کو شامل کرنے کا ذمہ دار ہو۔ اسے تخلیق کرتے وقت کسی نہ کسی طرح میں نے اسے یاد کیا۔ کوئی مسئلہ نہیں، ہم اسے ابھی بنائیں گے۔ گٹ ہب پر ایشو بنانے والے ٹیب پر جائیں اور فیچر کی درخواست کو منتخب کریں: ٹاسک کی تفصیل شامل کریں، اس کی قبولیت کا معیار، سیٹ کریں کہ یہ مسئلہ کس پروجیکٹ سے تعلق رکھتا ہے اور آپ ایک نیا ایشو بنا سکتے ہیں: اب، یہ دکھانے کے لیے کہ کام کو قبول کر لیا گیا ہے۔ کام کے لیے، To do on Progress سے کام کی حیثیت کو تبدیل کریں: یہ ایک مشکل مضمون ہونے والا ہے۔ اگر آپ کو کوئی پریشانی ہے تو تبصرے میں لکھیں: میں ان کی نگرانی کروں گا اور اپنی بہترین صلاحیت کے مطابق جواب دوں گا۔ یہ ایک چھوٹا سا کسٹمر سپورٹ ہوگا :Dایک ڈاکر فائل بنانا
ڈاکر فائل کیا ہے؟ ڈوکر کے لیے، یہ ایک اسکرپٹ ہے (مرحلہ وار ہدایات) کہ ڈوکر کنٹینر کے لیے تصویر کیسے بنائی جائے۔ ہماری درخواست کے کام کرنے کے لیے، ہمیں JDK، ورژن 11 کی ضرورت ہے۔ یعنی، ہمیں JDK 11 ڈاکر امیج کو تلاش کرنے اور اسے اپنی تصویر میں شامل کرنے کی ضرورت ہے۔ یہ اس کے مترادف ہے کہ ہم کس طرح میموری میں انحصار شامل کرتے ہیں۔ اس مقصد کے لیے Docker کے پاس DockerHub ہے ۔ مقامی طور پر تصاویر ڈاؤن لوڈ کرنے کے لیے، آپ کو وہاں رجسٹر کرنے کی ضرورت ہے۔ رجسٹریشن کے بعد، آئیے JDK11 کو تلاش کرتے ہیں۔ میں نے جو پایا اس سے، یہ کنٹینر ہے: adoptopenjdk/openjdk11 ۔ اس کنٹینر کی تفصیل میں وہ ہے جو dockerfile کے لیے درکار ہے:FROM adoptopenjdk/openjdk11:ubi
RUN mkdir /opt/app
COPY japp.jar /opt/app
CMD ["java", "-jar", "/opt/app/japp.jar"]
آئیے اس فولڈر کو ٹھیک کرتے ہیں جس سے ہم جار فائل لیتے ہیں۔ ایم وی این پیکج ماون ٹاسک چلانے کے بعد ہمارے پاس اسے ٹارگٹ فولڈر میں موجود ہے۔ یہ سب کرنے سے پہلے، اپ ڈیٹ شدہ مین برانچ کی بنیاد پر، ہم اپنے کام کے لیے ایک نیا بناتے ہیں: STEP_4_JRTB-13 ۔ اب آپ کام کر سکتے ہیں۔ پروجیکٹ کی جڑ میں، Dockerfile ایکسٹینشن کے بغیر ایک فائل بنائیں اور اندر درج ذیل کو شامل کریں:
FROM adoptopenjdk/openjdk11:ubi
ARG JAR_FILE=target/*.jar
COPY ${JAR_FILE} app.jar
ENTRYPOINT ["java","-jar","/app.jar"]
پہلی سطر وہ ہے جس پر تصویر کی بنیاد رکھی جائے گی - adoptopenjdk/openjdk11۔ دوسری لائن JAR_FILE نامی تصویر میں ایک دلیل شامل کرنا ہے، جو ٹارگٹ فولڈر میں واقع ہے۔ مزید یہ کہ موجودہ فولڈر کا تعین Dockerfile کے مقام سے ہوتا ہے۔ تیسری لائن - ہمارے پروجیکٹ کے جار کو ڈوکر امیج میں کاپی کریں۔ آخری لائن بنیادی طور پر ٹرمینل میں کمانڈ سے تخلیق کردہ ایک صف پر مشتمل ہے، جسے جگہ سے الگ کیا گیا تھا۔ یعنی، آخر میں درج ذیل پر عمل کیا جائے گا: "java -jar /app.jar" بوٹ ٹوکن کو خفیہ رکھنے کے لیے، کنٹینر کو شروع کرتے وقت ہمیں دو متغیرات پاس کرنے کی ضرورت ہوگی - بوٹ کا نام اور اس کا ٹوکن۔ ایسا کرنے کے لیے، ہم ایک سوال لکھیں گے جو ہمارے پروجیکٹ کو متغیر کے ساتھ شروع کرے۔ اور کیسے کرنا ہے؟ آپ کو اسے گوگل کرنے کی ضرورت ہے: یہاں ایک عام تفصیل کے ساتھ پہلا لنک ہے۔ ہم کیا کرنا چاہتے ہیں؟ ہمارے پاس application.properties فائل میں دو متغیر ہیں جن کی ہم وہاں وضاحت کرتے ہیں:
- bot.username
- bot.token
- آئیے bash اسکرپٹ کو چلاتے ہیں۔
- bash اسکرپٹ docker-compose چلاتا ہے۔
- Docker-compose ہماری درخواست کے ساتھ ایک docker کنٹینر لانچ کرتا ہے۔
- ڈوکر کنٹینر ہماری درخواست چلاتا ہے۔
FROM adoptopenjdk/openjdk11:ubi
ARG JAR_FILE=target/*.jar
ENV BOT_NAME=test.javarush_community_bot
ENV BOT_TOKEN=1375780501:AAE4A6Rz0BSnIGzeu896OjQnjzsMEG6_uso
COPY ${JAR_FILE} app.jar
ENTRYPOINT ["java", "-Dbot.username=${BOT_NAME}", "-Dbot.token=${BOT_TOKEN}", "-jar", "/app.jar"]
آپ دیکھ سکتے ہیں کہ ہم نے دو لائنیں شامل کیں اور ENTRYPOINT کو اپ ڈیٹ کیا۔ لائنز:
ENV BOT_NAME=test.javarush_community_bot
ENV BOT_TOKEN=1375780501:AAE4A6Rz0BSnIGzeu896OjQnjzsMEG6_uso
انکوڈر فائل کے اندر متغیرات کا اعلان کریں۔ پہلے سے طے شدہ طور پر ان کی ایک قدر متعین ہوتی ہے۔ اگر، اس ڈاکر فائل سے تصویر بناتے وقت، ایسے ناموں کے ساتھ ماحولیاتی متغیرات کو پاس کیا جاتا ہے، تو قدریں مختلف ہوں گی۔ اور ENTRYPOINT میں ہم نے کچھ اور عناصر شامل کیے جو ان ماحولیاتی متغیرات کو پڑھیں گے:
"-Dbot.username=${BOT_NAME}", "-Dbot.token=${BOT_TOKEN}"
یہاں آپ دیکھ سکتے ہیں کہ لائن کے اندر، ${} کی تعمیر کا استعمال کرتے ہوئے، BOT_NAME اور BOT_TOKEN کی اقدار کو پاس کیا جائے گا۔ اگلا، ہمیں یہ سکھانے کی ضرورت ہے کہ ان متغیرات کو کیسے حاصل کیا جائے اور اسے docker-compose میں منتقل کیا جائے۔
docker-compose.yml بنائیں
آپ کے لیے YAML فارمیٹ کے بارے میں الگ سے پڑھنا اچھا ہو گا، ورنہ مضمون پہلے ہی تیزی سے بڑھ رہا ہے۔ ہمارے لیے، یہ .properties قسم کے متغیرات کی صرف ایک اور تفصیل ہے۔ صرف خصوصیات میں یہ ایک نقطے کے ذریعے لکھا جاتا ہے، لیکن YAML میں یہ کچھ زیادہ خوبصورتی سے کیا جاتا ہے۔ مثلاً اس طرح۔ پراپرٹیز میں دو متغیرات: javarush.telegram.bot.name=ivan javarush.telegram.bot.token=pupkin لیکن .yaml میں (.yml کی طرح) یہ اس طرح ہوگا:javarush:
telegram:
bot:
name: ivan
token: pupkin
دوسرا آپشن زیادہ خوبصورت اور قابل فہم ہے۔ خالی جگہیں بالکل اسی طرح ہونی چاہئیں جیسا کہ اوپر بتایا گیا ہے۔ آئیے کسی طرح ہماری application.properties اور application.yml کا ترجمہ کریں۔ سب سے پہلے آپ کو اسے بنانے کی ضرورت ہے۔ پروجیکٹ کی جڑ میں، docker-compose.yml فائل بنائیں اور وہاں درج ذیل لکھیں:
version: '3.1'
services:
jrtb:
build:
context: .
environment:
- BOT_NAME=${BOT_NAME}
- BOT_TOKEN=${BOT_TOKEN}
restart: always
پہلی لائن ڈوکر کمپوز ورژن ہے۔ سروسز: کہتا ہے کہ اس کے بعد درج ذیل تمام سطریں (شفٹ ہو جائیں گی) ان خدمات کا حوالہ دیتی ہیں جنہیں ہم ترتیب دے رہے ہیں۔ ہمارے پاس اب تک ان میں سے صرف ایک ہے - ایک جاوا ایپلی کیشن جسے jrtb کہتے ہیں ۔ اور پہلے سے ہی اس کے نیچے اس کی تمام ترتیبات ہوں گی۔ مثال کے طور پر، build: context: . کہتا ہے کہ ہم Dockerfile کو اسی ڈائرکٹری میں تلاش کریں گے جیسے docker-compose.yml۔ لیکن ماحول: سیکشن اس بات کو یقینی بنانے کے لیے ذمہ دار ہو گا کہ ہم ضروری ماحولیاتی متغیرات کو Dockerfile میں منتقل کریں۔ بس ہمیں کیا ضرورت ہے۔ لہذا، ہم ذیل میں متغیرات کو منتقل کرتے ہیں۔ Docker-compose انہیں سرور آپریٹنگ ماحول کے متغیرات میں تلاش کرے گا۔ آئیے انہیں bash اسکرپٹ میں شامل کرتے ہیں۔
bash اسکرپٹس بنانا
آخری مرحلہ ایک bash اسکرپٹ بنانا ہے۔ پروجیکٹ کی جڑ میں start.sh نامی فائل بنائیں اور وہاں درج ذیل لکھیں:#!/bin/bash
# Pull new changes
git pull
# Prepare Jar
mvn clean
mvn package
# Ensure, that docker-compose stopped
docker-compose stop
# Add environment variables
export BOT_NAME=$1
export BOT_TOKEN=$2
# Start new deployment
docker-compose up --build -d
تمام باش اسکرپٹس کے لیے پہلی لائن کی ضرورت ہے: یہ اس کے بغیر کام نہیں کرے گی۔ اور پھر - ٹرمینل میں کمانڈز کا صرف ایک سیٹ جس پر عمل کرنے کی ضرورت ہے۔ میں نے ہر کمانڈ میں تبصرے شامل کیے ہیں لہذا یہ واضح ہونا چاہئے۔ میں صرف ایک چیز کی وضاحت کرنا چاہتا ہوں کہ $1 اور $2 کا کیا مطلب ہے۔ یہ دو متغیر ہیں جو bash اسکرپٹ کے شروع ہونے پر پاس ہو جائیں گے۔ برآمد کمانڈ کا استعمال کرتے ہوئے، انہیں سرور متغیرات میں شامل کیا جائے گا اور docker-compose میں پڑھا جائے گا۔ یہ Ubuntu کے لیے کام کرتا ہے، شاید ونڈوز کے لیے نہیں، لیکن مجھے یقین نہیں ہے۔ اب آپ کو stop.sh اسکرپٹ شامل کرنے کی ضرورت ہے، جس سے کام رک جائے گا۔ اس میں کئی سطریں ہوں گی:
#!/bin/bash
# Ensure, that docker-compose stopped
docker-compose stop
# Ensure, that the old application won't be deployed again.
mvn clean
یہاں ہم ڈوکر کمپوز کو روکتے ہیں اور پروجیکٹ جارنک کو صاف کرتے ہیں، جو آخری تعمیر کے بعد سے پڑا ہوا ہے۔ ہم یہ اس بات کو یقینی بنانے کے لیے کرتے ہیں کہ ہمارے پروجیکٹ کو درست طریقے سے دوبارہ بنایا جائے۔ نظیریں تھیں، اسی لیے میں شامل کر رہا ہوں) نتیجے کے طور پر، ہمارے پاس 4 نئی فائلیں ہیں:
- Dockerfile - ہماری درخواست کی تصویر بنانے کے لیے ایک فائل؛
- docker-compose.yml - ترتیبات کے ساتھ ایک فائل کہ ہم اپنے کنٹینرز کو کیسے لانچ کریں گے۔
- start.sh - ہماری درخواست کی تعیناتی کے لیے bash اسکرپٹ؛
- stop.sh ہماری درخواست کو روکنے کے لیے ایک bash اسکرپٹ ہے۔
# ریلیز نوٹس ## 0.3.0-SNAPSHOT * JRTB-13: پروجیکٹ میں تعیناتی کا عمل شامل کیا گیا ## 0.2.0-SNAPSHOT * JRTB-3: Telegram Bot کمانڈز کو سنبھالنے کے لیے نافذ کردہ کمانڈ پیٹرن ## 0.1.0-SNAPSHOT * JRTB -2: اسٹب ٹیلیگرام بوٹ شامل کیا گیا * JRTB-0: اسپرنگ بوٹ سکیلیٹن پروجیکٹ شامل کیا گیا
اور README میں ہم ایک نیا پیراگراف شامل کریں گے جس میں یہ بیان کیا جائے گا کہ ہماری درخواست کو کیسے تعینات کیا جائے:
## تعیناتی کی تعیناتی کا عمل ہر ممکن حد تک آسان: مطلوبہ سافٹ ویئر: - bash اسکرپٹ کو چلانے کے لیے ٹرمینل - docker - docker-compose ایپلی کیشن کو تعینات کرنے کے لیے، مطلوبہ برانچ میں سوئچ کریں اور bash اسکرپٹ چلائیں: $bash start.sh ${bot_username} ${bot_token } بس۔
بالکل، سب کچھ انگریزی میں لکھا جاتا ہے. ہمیشہ کی طرح، ہماری نئی بنائی گئی برانچ STEP_4_JRTB-13 میں ہم نام کے ساتھ ایک نیا عہد بناتے ہیں: JRTB-13: ڈوکر کے ذریعے تعیناتی کے عمل کو نافذ کریں اور اسے آگے بڑھائیں۔ میں ان چیزوں پر تفصیل سے غور کرنا چھوڑ دیتا ہوں جو میں نے پہلے ہی پچھلے مضامین میں بیان کیا ہے۔ مجھے ایک ہی بات کو دہرانے کا کوئی فائدہ نظر نہیں آتا۔ اس کے علاوہ، جن لوگوں نے اس کا پتہ لگایا اور خود کیا ان سے کوئی سوال نہیں ہوگا۔ یہ میں اس بارے میں بات کر رہا ہوں کہ نئی برانچ کیسے بنائی جائے، کمٹ کیسے بنائی جائے، ریپوزٹری میں کمٹ کو کیسے آگے بڑھایا جائے۔
GO TO FULL VERSION