اگر آپ نے کبھی Node.js پروجیکٹ بنایا ہے، تو آپ نے شاید اس طرح کا تجربہ کیا ہوگا۔ پروجیکٹ میرے کمپیوٹر پر ٹھیک چلتا ہے، لیکن جب میں اسے سرور پر دھکیلتا ہوں تو کچھ غلط ہو جاتا ہے۔
یہ ایک مختلف نوڈ ورژن، لاپتہ ماحولیاتی متغیرات، یا غیر مماثل نظام انحصار ہوسکتا ہے۔ آپ ایک گھنٹہ کسی ایسی چیز کو ڈیبگ کرنے میں صرف کرتے ہیں جو درحقیقت کوڈ کا مسئلہ نہیں تھا۔
ڈوکر اسے جڑ سے ٹھیک کرتا ہے۔ ڈوکر آپ کو صرف کوڈ کی ترسیل بند کرنے دیتا ہے۔ نوڈ ورژن، انحصار، اور کنفیگریشن سبھی کنٹینر کے اندر منتقل ہوتے ہیں۔ یہ لیپ ٹاپس، CI سرورز، اور پروڈکشن VMs میں یکساں کام کرتا ہے۔ مزید کوئی ماحولیاتی حیرت نہیں ہے۔
اس ٹیوٹوریل میں، ہم آپ کو ہر قدم پر چلائیں گے، بشمول مقامی ترقی کے لیے PostgreSQL کے ساتھ Docker Compose کا استعمال کرتے ہوئے ایک ملٹی سٹیپ Dockerfile، اور ہر انضمام کے ساتھ Docker Hub میں ایک نئی تصویر کو آگے بڑھانے کے لیے GitHub ایکشن ورک فلو۔ main.
اس ٹیوٹوریل کا مکمل کوڈ GitHub پر دستیاب ہے۔
انڈیکس
-
شرطیں
-
نمونہ کی درخواست
-
ڈاکر فائل لکھیں۔
-
.dockerignore فائل
-
.gitignore فائل
-
مقامی طور پر تصویر بنائیں اور جانچیں۔
-
مقامی ترقی کے لیے ڈوکر کمپوز
-
GitHub ایکشنز کے ساتھ خودکار بناتا ہے۔
-
تصویر کی تعیناتی
-
ختم
شرطیں
-
Node.js 18+
-
Docker ڈیسک ٹاپ، docs.docker.com/get-docker پر ڈاؤن لوڈ کے لیے دستیاب ہے۔ ڈوکر شروع ہونے سے پہلے ونڈوز صارفین کو WSL 2 کی ضرورت ہوگی۔ پاور شیل کو بطور ایڈمنسٹریٹر کھولیں اور اسے چلائیں۔
wsl --install. دوبارہ شروع کرنے کے بعد، Docker ڈیسک ٹاپ بغیر کسی مسئلے کے انسٹال ہو جائے گا۔ -
GitHub اکاؤنٹ
-
Docker Hub اکاؤنٹ (hub.docker.com پر مفت)
-
Express.js کا کچھ تجربہ مددگار ثابت ہوگا لیکن اس کی ضرورت نہیں۔
نمونہ کی درخواست
ہم ایکسپریس اور پوسٹگری ایس کیو ایل کا استعمال کرتے ہوئے ایک ٹاسک مینجمنٹ API بنا رہے ہیں۔ ذہن میں رکھیں کہ ایپ آپ کو یہ دکھانے کا ایک طریقہ ہے کہ یہ کیسے کام کرتا ہے۔ آپ نے یہاں جو Dockerfile اور پائپ لائن ترتیب دی ہے وہ تمام Node.js پروجیکٹس میں اسی طرح کام کرے گی۔
ایک پروجیکٹ بنائیں:
mkdir nodejs-docker-cicd && cd nodejs-docker-cicd
npm init -y
npm install express pg dotenv
npm install --save-dev nodemon
بنانا src/index.js:
const express = require('express');
const { Pool } = require('pg');
require('dotenv').config();
const app = express();
app.use(express.json());
const pool = new Pool({
host: process.env.DB_HOST,
port: process.env.DB_PORT,
database: process.env.DB_NAME,
user: process.env.DB_USER,
password: process.env.DB_PASSWORD,
});
// Create table on startup
pool.query(`
CREATE TABLE IF NOT EXISTS tasks (
id SERIAL PRIMARY KEY,
title VARCHAR(255) NOT NULL,
completed BOOLEAN DEFAULT FALSE,
created_at TIMESTAMP DEFAULT NOW()
)
`).catch(console.error);
// Health check — required for Docker HEALTHCHECK and load balancers
app.get('/health', (req, res) => {
res.json({ status: 'ok', timestamp: new Date().toISOString() });
});
app.get('/tasks', async (req, res) => {
try {
const result = await pool.query('SELECT * FROM tasks ORDER BY created_at DESC');
res.json(result.rows);
} catch (err) {
res.status(500).json({ error: err.message });
}
});
app.post('/tasks', async (req, res) => {
const { title } = req.body;
if (!title) return res.status(400).json({ error: 'Title is required' });
try {
const result = await pool.query(
'INSERT INTO tasks (title) VALUES ($1) RETURNING *',
How to Containerize a Node.js Application with Docker and Deploy with GitHub Actions
);
res.status(201).json(result.rows[0]);
} catch (err) {
res.status(500).json({ error: err.message });
}
});
app.patch('/tasks/:id', async (req, res) => {
const { id } = req.params;
const { completed } = req.body;
try {
const result = await pool.query(
'UPDATE tasks SET completed = $1 WHERE id = $2 RETURNING *',
[completed, id]
);
if (result.rows.length === 0) return res.status(404).json({ error: 'Task not found' });
res.json(result.rows[0]);
} catch (err) {
res.status(500).json({ error: err.message });
}
});
const PORT = process.env.PORT || 3000;
app.listen(PORT, () => console.log(`Server running on port ${PORT}`));
کھلا package.json اپ ڈیٹ اور "scripts" جز وقتی ملازمت:
"scripts": {
"start": "node src/index.js",
"dev": "nodemon src/index.js"
}
npm start اپنی ایپ کو براہ راست Node.js کے ساتھ چلائیں۔ npm run dev چونکہ میں نوڈیمون استعمال کرتا ہوں، جب میں فائل میں ترمیم کرتا ہوں تو سرور خود بخود دوبارہ شروع ہوجاتا ہے۔
ڈوکر کے بغیر چلانے کے لیے .env فائل:
DB_HOST=localhost
DB_PORT=5432
DB_NAME=tasksdb
DB_USER=postgres
DB_PASSWORD=yourpassword
PORT=3000
ڈیٹا بیس کی تمام اسناد ہارڈ کوڈ نہیں ہیں بلکہ ماحولیاتی متغیرات سے آتی ہیں۔ متغیرات کو تبدیل کرنے سے ایک ہی تصویر آپ کے مقامی یا پروڈکشن ڈیٹا بیس کے خلاف چلے گی۔ کسی کوڈ کو تبدیل کرنے کی ضرورت نہیں ہے۔ کہ /health اختتامی نقطہ وہی ہے جو ڈوکر اس بات کی تصدیق کرنے کے لیے پنگ کرتا ہے کہ آپ کی ایپ درحقیقت درخواست پر کارروائی کر رہی ہے۔
ڈاکر فائل لکھیں۔
Dockerfile کو چھونے سے پہلے، دو اصطلاحات ہیں جو آپ دیکھتے رہیں گے: نہیں۔ ویڈیو آپ کی ایپ کا ایک ناقابل تغیر، پیک شدہ ورژن جس میں نوڈ رن ٹائم، کوڈ، اور انحصار ایک ساتھ ایک نمونے میں شامل ہے۔ کوئی راستہ نہیں کنٹینر اس تصویر کی چلتی ہوئی مثال۔ ایک تصویر، بہت سے کنٹینرز، تمام مشینیں۔
ڈاکر فائل جو ہم استعمال کریں گے وہ ہے:
# ── Stage 1: Install dependencies ──────────────────────────────────────────
FROM node:18-alpine AS builder
WORKDIR /app
# Copy package files first — Docker caches this layer separately.
# If you only change src code (not package.json), Docker skips npm ci on rebuild.
COPY package*.json ./
RUN npm ci
COPY . .
# ── Stage 2: Production image ───────────────────────────────────────────────
FROM node:18-alpine AS production
# Create a non-root user — running as root inside a container is a security risk
RUN addgroup -g 1001 -S nodejs && \
adduser -S nodeuser -u 1001
WORKDIR /app
COPY package*.json ./
RUN npm ci --only=production
# Copy only the source code from the builder stage (not node_modules or dev files)
COPY --from=builder /app/src ./src
RUN chown -R nodeuser:nodejs /app
USER nodeuser
EXPOSE 3000
# Docker will ping /health every 30s. If it fails 3 times, the container is marked unhealthy.
HEALTHCHECK --interval=30s --timeout=3s --start-period=5s --retries=3 \
CMD wget --no-verbose --tries=1 --spider http://localhost:3000/health || exit 1
CMD ["node", "src/index.js"]
یہ ایک کثیر مرحلہ تعمیر ہے۔ پہلا قدم (builder) ترقی کے انحصار سمیت ہر چیز کو انسٹال کرے گا۔ دوسرا مرحلہ (production) تازہ شروع ہوتا ہے اور صرف وہی کاپی کرتا ہے جو ایپ کو چلانے کے لیے درکار ہے۔ نوڈیمون، ٹیسٹنگ فریم ورک، اور دیگر صرف ترقی پذیر اشیاء حتمی تصویر میں شامل نہیں ہیں۔
سائز کا فرق واقعی قابل دید ہے۔ کوئی راستہ نہیں node:18 Debian تصویر 950MB سے زیادہ ہے۔ پر سوئچ کریں۔ node:18-alpine اگر آپ ترقیاتی انحصار کو ختم کرتے ہیں تو، حتمی تصویر اس کی بجائے 150-200MB کے لگ بھگ ہوگی۔ چھوٹی تصویروں کا مطلب ہے تیز دھکے اور تیزی سے تعیناتی۔
npm ci اس کے بجائے npm install یہ CI/CD کے لیے جان بوجھ کر انتخاب ہے۔ ذیل میں صحیح ورژن پڑھیں: package-lock.json یہ ناکام ہو جائے گا اگر لاک فائلیں مماثل نہیں ہیں۔ package.json. ہر مشین پر ہر تعمیر بالکل وہی ورژن انسٹال کرتی ہے۔ یہ حیرت کی بات نہیں ہے، انحصار راتوں رات خاموشی سے اپ ڈیٹ ہونے کے ساتھ۔
کہ nodeuser اکاؤنٹ موجود ہے کیونکہ کنٹینر بطور ڈیفالٹ روٹ چلتا ہے۔ جب تک کچھ غلط نہ ہو تب تک یہ ٹھیک ہے۔ ایک غیر جڑ صارف کا مطلب ہے کہ ایک بار کنٹینر کے اندر، حملہ آور جو چاہے وہ نہیں کر سکتا۔
کہ .dockerignore فائل
بنانا .dockerignore تعمیر سے پہلے:
node_modules
npm-debug.log
.env
.git
.gitignore
README.md
Dockerfile
.dockerignore
کہ node_modules اخراج انتہائی اہمیت کا حامل ہے۔ مقامی ماڈیولز آپ کے آپریٹنگ سسٹم کے لیے مرتب کیے گئے ہیں۔ میکوس یا ونڈوز بائنریز لینکس کنٹینرز میں کام نہیں کریں گے۔ اس کو چھوڑنے کا مطلب یہ ہے کہ ڈوکر تعمیر کے دوران درست پلیٹ فارم کے لیے مرتب کردہ نئے ماڈیولز انسٹال کرے گا۔ ان اخراج کے بغیر، آپ خراب شدہ بائنریز کو اپنی تصویر میں کاپی کرنے یا تعمیراتی سیاق و سباق میں سیکڑوں میگا بائٹس اپ لوڈ کرنے میں وقت ضائع کرتے ہیں۔
اسے کبھی نہ ڈالیں۔ .env تصویر میں۔ کوئی بھی حساس آئٹمز جیسے پاس ورڈ، API کیز وغیرہ کو رن ٹائم کے وقت ماحولیاتی متغیرات کے طور پر داخل کیا جاتا ہے نہ کہ تصویر میں۔
کہ .gitignore فائل
آپ کے پہلے عہد سے پہلے ایک اور چیز: .gitignore. آپ نہیں چاہتے node_modules یا .env ٹریک کیا گیا:
node_modules/
.env
.env.local
npm-debug.log*
logs/
.DS_Store
Thumbs.db
.vscode/
.idea/
dist/
build/
مقامی طور پر تصویر بنائیں اور جانچیں۔
سب سے پہلے، ڈوکر ڈیسک ٹاپ کھولیں اور ایک لمحے کا انتظار کریں۔ ونڈوز میں، انجن کے شروع ہونے کے دوران ٹاسک بار میں ایک حرکت پذیر وہیل کا آئیکن ظاہر ہوتا ہے۔ ایک بار جب آپ چلتے ہیں، Docker کمانڈز کو چلانا ایک اچھا خیال ہے۔ اگر آپ انجن کے چلنے سے پہلے ڈوکر چلانے کی کوشش کرتے ہیں تو، درج ذیل ہوتا ہے:
ERROR: Error response from daemon: Docker Desktop is unable to start
اس صورت میں، Docker Desktop کو چھوڑ دیں۔ ایڈمنسٹریٹر کی مراعات کے ساتھ پاور شیل کھولیں اور چلائیں: wsl --updateاور دوبارہ شروع کریں۔ پھر کنٹرول پینل → پروگرامز → ونڈوز کی خصوصیات کو آن یا آف پر جائیں۔ آپ کو Hyper-V اور ورچوئل مشین پلیٹ فارم دونوں کو چیک کرنا چاہیے۔ دوبارہ شروع کرنے کے بعد، Docker ڈیسک ٹاپ عام طور پر ظاہر ہوتا ہے۔
اس غلطی سے بھی آگاہ ہونا اچھا ہے۔
docker : The term 'docker' is not recognized as the name of a cmdlet, function,
script file, or operable program.
اس کا مطلب ہے کہ ڈوکر ڈیسک ٹاپ نہیں چل رہا ہے یا انسٹال نہیں ہے۔ اسے اسٹارٹ مینو سے کھولیں اور انتظار کریں۔
تعمیر کو چلائیں۔
docker build -t nodejs-docker-cicd:latest .
اس میں ابتدائی طور پر 30 سیکنڈ لگتے ہیں کیونکہ ڈوکر کو پل کرنا ہوتا ہے۔ node:18-alpine انٹرنیٹ پر۔ ایک بار کیش ہو جانے کے بعد، بعد کی تعمیرات بہت تیز ہوں گی۔ دونوں مراحل اس طرح سکرول کریں:
[+] Building 33.1s (17/17) FINISHED
=> [builder 1/5] FROM docker.io/library/node:18-alpine 20.9s
=> [builder 4/5] RUN npm ci 3.5s
=> [production 5/7] RUN npm ci --only=production 3.2s
=> [production 7/7] RUN chown -R nodeuser:nodejs /app 3.2s
=> exporting to image 1.5s
=> => naming to docker.io/library/nodejs-docker-cicd:latest 0.0s
جب آپ دیکھتے ہیں (17/17) FINISHED تصویر بنائی گئی ہے۔ براہ کرم سائز چیک کریں:
docker images nodejs-docker-cicd
IMAGE ID DISK USAGE CONTENT SIZE
nodejs-docker-cicd:latest c9eed311d999 198MB 47.5MB
مواد کا سائز (47.5MB) وہ کمپریسڈ سائز ہے جسے Docker Hub میں دھکیل دیا جاتا ہے۔ ڈسک کا استعمال (198MB) وہ رقم ہے جو ڈسک پر مقامی طور پر لی جاتی ہے۔ a کے ساتھ اس کا موازنہ کریں۔ node:18 950+ MB ڈیبین تصویر پر ایک نظر یہ ظاہر کرتی ہے کہ الپائن پر مبنی اور ملٹی سٹیپ اپروچ کیوں اہم ہے۔
اس کے بعد کی تعمیرات میں، ڈوکر کیشڈ پرتوں کو دوبارہ استعمال کرتا ہے۔ کسی بھی چیز کو چھوئے بغیر سورس فائلوں میں ترمیم کریں۔ package.json اور npm ci قدم کو مکمل طور پر چھوڑ دیں۔ 33 سیکنڈ میں پہلی تعمیر 3 سیکنڈ بن جاتی ہے۔
مقامی ترقی کے لیے ڈوکر کمپوز
آپ کی ایپ کو ڈیٹا بیس کی ضرورت ہے۔ PostgreSQL کو مقامی طور پر ترتیب دینے کا مطلب یہ ہے کہ ذخیرہ کو کلون کرنے والے کسی بھی ڈویلپر کو بھی ایسا کرنا چاہیے۔ ڈوکر کمپوز آپ کے لیے اس کا خیال رکھتا ہے۔ ایک فائل دونوں خدمات کی وضاحت کرتی ہے اور انہیں ایک کمانڈ سے شروع کرتی ہے۔
بنانا docker-compose.yml:
services:
app:
build:
context: .
target: production
ports:
- '3000:3000'
environment:
DB_HOST: postgres
DB_PORT: 5432
DB_NAME: tasksdb
DB_USER: postgres
DB_PASSWORD: postgres
PORT: 3000
depends_on:
postgres:
condition: service_healthy
restart: unless-stopped
postgres:
image: postgres:15-alpine
environment:
POSTGRES_DB: tasksdb
POSTGRES_USER: postgres
POSTGRES_PASSWORD: postgres
ports:
- '5432:5432'
volumes:
- postgres_data:/var/lib/postgresql/data
healthcheck:
test: ['CMD-SHELL', 'pg_isready -U postgres']
interval: 5s
timeout: 5s
retries: 5
volumes:
postgres_data:
چند باتیں قابل توجہ ہیں۔ DB_HOST پر مقرر ہے postgres. خدمت کا نام نہیں۔ localhost. ایک ہی ڈوکر نیٹ ورک پر کنٹینرز سروس کے ناموں سے ایک دوسرے سے جڑے ہوئے ہیں۔ ڈال localhost ایپ خود سے جڑنے کی کوشش کرے گی۔
depends_on کے ساتھ condition: service_healthy پوسٹگریس ایپ کو ہولڈ پر رکھتا ہے جب تک کہ یہ صحت کی جانچ کو حقیقت میں پاس نہ کر لے۔ اگر آپ اسے چھوڑ دیتے ہیں تو ایپ شروع ہو جائے گی، ایسے ڈیٹا بیس سے جڑنے کی کوشش کریں جو ابھی تیار نہیں ہے، اور کریش ہو جائے گا۔ اسٹیٹس چیک پنگ pg_isready ہر 5 سیکنڈ میں۔ اگر آپ کو سبز جواب ملتا ہے، تو ایپ کنٹینر شروع ہو جائے گا۔
نام کا حجم postgres_data دوبارہ شروع ہونے پر ڈیٹا کو برقرار رکھتا ہے۔ چلائیں docker compose down آپ کا ڈیٹا اگلی بار بھی موجود رہے گا۔ شامل کریں --volumes اسے صاف کرنے کے لیے۔
دونوں خدمات شروع کریں۔
docker compose up --build
آپ دیکھیں گے کہ PostgreSQL شروع کیا گیا اور پھر ایپ لانچ ہوئی۔ ایک بار دیکھ لیں۔ Server running on port 3000 لاگ سے، اسٹیک کام کر رہا ہے۔
ٹیسٹ کرنے کے لیے دوسرا ٹرمینل کھولیں۔ تخلیق لاگ کو پہلے ٹرمینل میں چلتے رہنے دیں۔
Linux/macOS:
curl -X POST http://localhost:3000/tasks \
-H "Content-Type: application/json" \
-d '{"title": "Learn Docker"}'
curl http://localhost:3000/tasks
curl http://localhost:3000/health
ونڈوز پاور شیل: بلے باز curl پاور شیل چلانے سے Invoke-WebRequestاصل curls نہیں. چلائیں curl.exe اس کے بجائے. JSON باڈی کے لیے، پہلے اسے فائل میں لکھیں۔
'{"title": "Learn Docker"}' | Set-Content body.json
curl.exe -X POST http://localhost:3000/tasks -H "Content-Type: application/json" --data `@body.json
curl.exe http://localhost:3000/tasks
curl.exe http://localhost:3000/health
پچھلا بیک ٹک @body.json آپ کو اس کی ضرورت ہے۔ بصورت دیگر پاور شیل اس کی تشریح کرنے کی کوشش کرے گا۔ @ کرل کرنے کے لیے اسے فائل نام کے سابقہ کے طور پر منتقل کرنے کے بجائے، ہم اسے اسپلٹنگ آپریٹر کے طور پر استعمال کرتے ہیں۔
آپ کو اس طرح کا جواب نظر آئے گا:
# POST /tasks
{"id":1,"title":"Learn Docker","completed":false,"created_at":"2026-07-09T22:21:17.073Z"}
# GET /tasks
[{"id":1,"title":"Learn Docker","completed":false,"created_at":"2026-07-09T22:21:17.073Z"}]
# GET /health
{"status":"ok","timestamp":"2026-07-09T22:11:44.700Z"}
نوکری ایک کنٹینر سے PostgreSQL تک پہنچی اور ایپ کے ذریعے واپس آگئی۔ Ctrl+C کمپوز ٹرمینل میں دونوں کو روکیں۔
GitHub ایکشنز کے ساتھ خودکار بناتا ہے۔
تصویر مقامی طور پر کام کرتی ہے، لہذا اب آپ کو اسے دستی طور پر کرنا بند کرنا ہوگا۔
مرحلہ 1: ڈوکر ہب تک رسائی کا ٹوکن بنائیں
hub.docker.com پر جائیں اور اکاؤنٹ کی ترتیبات → سیکیورٹی → نیا رسائی ٹوکن منتخب کریں۔ اگر یہ صرف پڑھنے کے لیے ہے، تو پش رک جائے گا، اس لیے پڑھنے اور لکھنے کی اجازتیں سیٹ کریں۔ ٹوکن صرف ایک بار ظاہر ہوتا ہے، لہذا صفحہ بند کرنے سے پہلے اسے کاپی کریں۔
سیکورٹی انتباہ: اس ٹوکن کو چیٹ، ای میل، یا کمٹ میں چسپاں نہ کریں۔ اگر آپ غلطی سے اسے بے نقاب کرتے ہیں، تو اسے فوری طور پر حذف کریں اور ایک نیا بنائیں۔
مرحلہ 2: اپنے GitHub ذخیرہ میں ایک راز شامل کریں۔
ترتیبات → راز اور متغیرات → ایکشنز ان ریپوزٹری پر جائیں اور درج ذیل کو شامل کریں:
-
DOCKERHUB_USERNAME– ڈوکر ہب کا صارف نام -
DOCKERHUB_TOKENٹوکن یہاں چسپاں کریں، اسے کہیں اور نہ چسپاں کریں۔
اگر آپ سے ملاقات ہو جائے۔ Error: Username and password requiredراز ابھی تک محفوظ نہیں ہوا ہے یا نام غلط درج کیا گیا ہے۔ دونوں کیس حساس ہیں۔
آپ کے نوشتہ جات میں نوڈ 20 فرسودگی کے انتباہات دیکھنا معمول ہے۔ یہ اندرونی ڈوکر آپریشنز سے آتا ہے، آپ کے کوڈ سے نہیں۔
مرحلہ 3: ورک فلو فائل بنائیں
بنانا .github/workflows/docker-publish.yml:
name: Build and Push Docker Image
on:
push:
branches: [main]
pull_request:
branches: [main]
env:
IMAGE_NAME: ${{ secrets.DOCKERHUB_USERNAME }}/nodejs-docker-cicd
jobs:
build-and-push:
runs-on: ubuntu-latest
steps:
- name: Checkout code
uses: actions/checkout@v4
- name: Set up Docker Buildx
uses: docker/setup-buildx-action@v3
- name: Log in to Docker Hub
if: github.event_name != 'pull_request'
uses: docker/login-action@v3
with:
username: ${{ secrets.DOCKERHUB_USERNAME }}
password: ${{ secrets.DOCKERHUB_TOKEN }}
- name: Extract metadata
id: meta
uses: docker/metadata-action@v5
with:
images: ${{ env.IMAGE_NAME }}
tags: |
type=sha,prefix=sha-
type=raw,value=latest,enable={{is_default_branch}}
- name: Build and push
uses: docker/build-push-action@v5
with:
context: .
target: production
push: ${{ github.event_name != 'pull_request' }}
tags: ${{ steps.meta.outputs.tags }}
labels: ${{ steps.meta.outputs.labels }}
cache-from: type=gha
cache-to: type=gha,mode=max
لاگ ان مرحلے پر if: github.event_name != 'pull_request'. پل کی درخواستوں کے لیے توثیق کو چھوڑ دیں۔ فورک کے PR کو آپ کے راز تک رسائی حاصل نہیں ہے، لہذا لاگ ان کی کوئی بھی کوشش ناکام ہو جائے گی۔ ڈوکر فائل کی توثیق کرنے کے لئے یہ تعمیر اب بھی PR سے چلے گی، لیکن تصویر کو آگے نہیں بڑھایا جائے گا۔
میٹا ڈیٹا آپریشنز ہر انضمام کے لیے دو ٹیگ تیار کرتے ہیں۔ main: latest اور ایک مختصر کمٹ SHA لائیک sha-a1b2c3d. SHA ٹیگز رول بیکس کو عملی بناتے ہیں۔ اگر latest اگر پیداوار رک جاتی ہے تو وہ سب کچھ واپس لایا جا سکتا ہے جو پہلے تھا۔ sha- ایک بار جب آپ اسے ٹیگ کرتے ہیں، تو یہ سیکنڈوں میں ایک معروف اچھی حالت میں واپس آجاتا ہے۔
کہ cache-from/cache-to: type=gha لائن ڈوکر کے لیئر کیشے کو گٹ ہب ایکشنز کے بلٹ ان کیشے میں اسٹور کرتی ہے۔ پہلا رن شروع سے سب کچھ بناتا ہے۔ اس کے بعد، غیر تبدیل شدہ تہوں کو دوبارہ بنانے کے بجائے کیشے سے نکالا جاتا ہے۔ ایک عام Node.js ایپ کے لیے، تعمیر کا وقت 2-3 منٹ سے کم کر کے 30 سیکنڈ سے کم کر دیا جاتا ہے۔
دبائیں اور اسے چلتے ہوئے دیکھیں
git add .
git commit -m "Add Docker configuration and GitHub Actions workflow"
git push origin main
ریپوزٹری پر جائیں۔ عمل ٹیگ آپ حقیقی وقت میں ورک فلو کو چلتے ہوئے دیکھ سکتے ہیں۔ ہر قدم مکمل ہوتے ہی یہ سبز ہو جاتا ہے۔
✅ Checkout code
✅ Set up Docker Buildx
✅ Log in to Docker Hub
✅ Extract metadata
✅ Build and push
مجموعی طور پر، سبز کا مطلب ہے کہ تصویر Docker Hub پر شائع کی گئی ہے۔ دو ٹیگ، latest اور SHA کا عہد کریں۔ sha-a1b2c3d. ہر دھکا main یہ یہاں سے خود بخود بنایا اور بھیج دیا گیا ہے۔
تصویر کی تعیناتی
Docker Hub کی تصاویر آپ کو کسی بھی انفراسٹرکچر پر تعینات کرنے کی اجازت دیتی ہیں۔
کوئی بھی VPS یا سرور:
docker pull yourusername/nodejs-docker-cicd:latest
docker run -d -p 3000:3000 \
-e DB_HOST=your-db-host \
-e DB_NAME=tasksdb \
-e DB_USER=postgres \
-e DB_PASSWORD=yourpassword \
yourusername/nodejs-docker-cicd:latest
ریلوے — اپنی ڈوکر ہب امیج کو ریل روڈ ڈیش بورڈ سے جوڑیں اور یہ آپ کے اگلے پش پر لگائی جائے گی۔
Fly.io –.دوڑنا n fly launch بس اپنے ڈاکر فائل کی طرف اشارہ کریں اور فلائی باقی کا خیال رکھے گی۔
کھڑا – ڈوکر ہب امیج یو آر ایل کو رینڈر سروس سیٹنگز میں چسپاں کریں۔
ہر دھکا main ورک فلو چلائیں۔ نئی تصویر کو Docker Hub میں منتقل کر دیا گیا ہے اور پلیٹ فارم اسے اٹھا لے گا۔ اس کے لیے تقسیم کا انتظام کیا جاتا ہے۔
ختم
مقامی Node.js ایپ کے طور پر شروع ہونے والی چیز اب ایک کنٹینر میں چلتی ہے۔ آپ کسی بھی مشین پر، اصل PostgreSQL پر جو آپ تیار کر رہے ہیں، یا جس پائپ لائن میں آپ ڈوکر ہب کو بناتے اور پیش کرتے ہیں، اس پر آپ کو ایسا ہی برتاؤ حاصل ہو سکتا ہے، بغیر دھکے کے بعد کچھ کرنے کے۔
ملٹی سٹیپ بلڈز تصاویر کو جامع رکھتی ہیں۔ یہ ڈویلپمنٹ ٹولز کو اکیلا چھوڑ دیتا ہے، غیر جڑ استعمال کرنے والوں کو خارج کرتا ہے، اور صحت کی جانچ بھی شامل ہے۔ کمپوز ریپوزٹری کو کلون کرنے والے کسی بھی شخص کے لیے ایک کمانڈ میں پورے اسٹیک کو آزاد کر دیتا ہے۔ تمام GitHub ایکشنز میں SHA ٹیگز کا مطلب ہے کہ رول بیک صرف پرانے ٹیگ کو بازیافت کرنے کا معاملہ ہے۔
یہی پیٹرن (ملٹی اسٹیج بلڈز، کمپوز فار لوکل ڈیولپمنٹ، خودکار امیج پبلشنگ) پوری صنعت میں Node.js کی پروڈکشن کے لیے استعمال کیے جاتے ہیں۔ ایک بار جب آپ ان نمونوں کا انتخاب کرتے ہیں، تو وہ آپ کے تمام منصوبوں پر آپ کی پیروی کریں گے۔
آپ اپنی پائپ لائن کو یہاں بڑھا سکتے ہیں۔ آپ عمارت سے پہلے ٹیسٹ کے مراحل شامل کر سکتے ہیں، یا اگر آپ ARM کو نشانہ بنا رہے ہیں تو ملٹی پلیٹ فارم سپورٹ شامل کر سکتے ہیں۔ جب ڈوکر کمپوز پیداوار میں محدود محسوس کرنے لگتا ہے، تو عام طور پر کبرنیٹس کام میں آتا ہے۔