ডকারফাইলে (Dockerfile) কনটেইনারের ভেতরের ফাইল ও পাথ ব্যবস্থাপনার জন্য WORKDIR একটি অত্যন্ত গুরুত্বপূর্ণ ইনস্ট্রাকশন। পূর্ববর্তী পর্বে আমরা CMD কমান্ডের কাজ বিস্তারিত দেখেছি। আজকের পর্বে আমরা জানব: WORKDIR ব্যবহার না করলে কী সমস্যা হয়, এটি কীভাবে ডিরেক্টরি পাথ সরল করে এবং কনটেইনারের ভেতরে এক্সিকিউশন কনটেক্সট সেট করে।
১. ডিফল্ট আচরণ: WORKDIR ছাড়া কী ঘটে?
একটি লিনাক্স বেজ ইমেজে (যেমন: ubuntu:24.04) ডিফল্টভাবে সক্রিয় ওয়ার্কিং ডিরেক্টরি থাকে একদম মূল রুট ডিরেক্টরি (/)।
যদি আমরা WORKDIR ব্যবহার না করে সাধারণ RUN mkdir /app কমান্ড দিয়ে একটি ফোল্ডার তৈরি করি, তবে ডকার শুধুমাত্র ফোল্ডারটি তৈরি করে কিন্তু সক্রিয় পাথ পরিবর্তন করে না। ফলে পরবর্তী সকল ইনস্ট্রাকশন রুট ডিরেক্টরিতেই (/) চলতে থাকে।
┌────────────────────────────────────────────────────────────────────────┐
│ ১. WORKDIR ছাড়া প্রক্রিয়া │
│ │
│ ডিফল্ট পাথ: / (Root) │
│ ├── RUN mkdir /app ──▶ ফোল্ডার তৈরি হলো, কিন্তু কারেন্ট পাথ '/' │
│ ├── COPY server.go /app/ ──▶ কপি করতে পুরো পাথ উল্লেখ করতে হয় │
│ └── CMD ["go", "run", "/app/server.go"] ──▶ এবসলিউট পাথ বাধ্যতামূলক │
└────────────────────────────────────────────────────────────────────────┘
VS
┌────────────────────────────────────────────────────────────────────────┐
│ ২. WORKDIR সহ প্রক্রিয়া │
│ │
│ WORKDIR /app │
│ ├── স্বয়ংক্রিয়ভাবে '/app' ফোল্ডার তৈরি হয় (যদি না থাকে) │
│ ├── পরবর্তী সকল নির্দেশের কারেন্ট পাথ '/app' এ সেট হয়ে যায় │
│ ├── COPY server.go ./ ──▶ সরাসরি কারেন্ট পাথে কপি │
│ └── CMD ["go", "run", "server.go"] ──▶ কোনো পাথ প্রিফিক্স লাগে না │
└────────────────────────────────────────────────────────────────────────┘
২. কেস স্টাডি ১: WORKDIR ছাড়া ডকারফাইল কনফিগারেশন
যদি আমরা WORKDIR ব্যবহার না করি, তাহলে ডকারফাইলটি দেখতে এমন হয়:
# বেজ ইমেজ ও Golang ইনস্টলেশন
FROM ubuntu:24.04
RUN apt update
RUN apt install -y golang
# ম্যানুয়ালি ফোল্ডার তৈরি
RUN mkdir /app
# রুট কনটেক্সট থেকে /app পাথে কোড কপি
COPY ./server.go /app/server.go
# এবসলিউট পাথ উল্লেখ করে কমান্ড রান
CMD ["go", "run", "/app/server.go"]
এর সীমাবদ্ধতাসমূহ:
-
পাথের পুনরাবৃত্তি: প্রতিটি ফাইলে
/app/বা সম্পূর্ণ পাথ বারবার টাইপ করতে হয়। -
কমান্ড ফেইল হওয়ার ঝুঁকি:
CMDবাRUN-এ সরাসরি ফাইলের নাম দিলে তা রুটে (/) খোঁজার চেষ্টা করবে এবংNo such fileএরর দেবে। -
ডিবাগিংয়ের অসুবিধা:
docker execদিয়ে কন্টেইনারে প্রবেশ করলে ডিফল্টভাবে রুটে (/) ল্যান্ড করতে হয়, ফলে বারবারcd /appকরতে হয়।
৩. কেস স্টাডি ২: WORKDIR দিয়ে আদর্শ ডকারফাইল কনফিগারেশন
ডকারফাইলে WORKDIR /app ইনস্ট্রাকশন দিলে এটি একাধারে ফোল্ডার তৈরি এবং ভেতরে প্রবেশের কাজটি স্বয়ংক্রিয়ভাবে সম্পন্ন করে:
FROM ubuntu:24.04
RUN apt update
RUN apt install -y golang
# ওয়ার্কিং ডিরেক্টরি নির্ধারণ
WORKDIR /app
# কারেন্ট ডিরেক্টরিতে (./) কোড কপি
COPY ./server.go ./server.go
# সরাসরি ফাইলনেম দিয়ে অ্যাপ্লিকেশন চালু
CMD ["go", "run", "server.go"]
৪. WORKDIR ব্যবহারের মূল সুবিধাসমূহ
┌─────────────────────────────────────────────────────────────┐
│ WORKDIR-এর প্রধান সুবিধাসমূহ │
├─────────────────────────────────────────────────────────────┤
│ 1. Auto-Directory Creation : ফোল্ডার না থাকলে নিজে তৈরি করে │
│ 2. Context Switching : পরবর্তী কমান্ডের পাথ নির্ধারণ করে │
│ 3. Clean Syntax : অপ্রয়োজনীয় এবসলিউট পাথ দূর করে │
│ 4. Direct Container Entry : docker exec সরাসরি পাথে খোলে │
└─────────────────────────────────────────────────────────────┘
-
স্বয়ংক্রিয় ডিরেক্টরি তৈরি: যদি নির্ধারিত ডিরেক্টরি আগে থেকে বিদ্যমান না থাকে, ডকার নিজে থেকেই সেটি তৈরি করে নেয় (আলাদা করে
RUN mkdirদেওয়ার দরকার নেই)। -
সাবসিকুয়েন্ট কমান্ড কনটেক্সট:
WORKDIR-এর পরবর্তী সবRUN,COPY,ADD,CMDএবংENTRYPOINTওই নির্দিষ্ট ডিরেক্টরির ভেতর কার্যকর হয়। -
ক্লিন টার্মিনাল সেশন:
docker exec -it <container_id> bashদিয়ে কন্টেইনারে প্রবেশ করলে সরাসরি/appডিরেক্টরিতে নিয়ে যায়।
৫. হ্যান্ডস-অন প্র্যাকটিস: বিল্ড, রান ও ভেরিফিকেশন
১. ইমেজ বিল্ড করা
docker build -t new_go_server:1.0.3 .
বিল্ড চলাকালীন ডকার স্বয়ংক্রিয়ভাবে /app ডিরেক্টরি সেট করে এবং server.go ফাইলটি কপি করে।
২. কন্টেইনার রান করা
docker run new_go_server:1.0.3
আউটপুট:
Server is running on port 8080
৩. কন্টেইনারে প্রবেশ ও পাথ যাচাই
অন্য একটি টার্মিনাল ওপেন করে কন্টেইনারের অভ্যন্তরীণ অবস্থা পরীক্ষা করা যাক:
# কন্টেইনারের ভেতর প্রবেশ
docker exec -it <CONTAINER_ID> bash
# বর্তমান লোকেশন যাচাই
pwd
# আউটপুট: /app
ls
# আউটপুট: server.go
কার্ল (curl) দিয়ে রিকোয়েস্ট পাঠালে সার্ভার রেসপন্স পাওয়া যাবে:
curl http://localhost:8080
# আউটপুট: Hello World!
ডকারফাইল কমান্ড সারসংক্ষেপ
| ইনস্ট্রাকশন | কাজ | ব্যবহারের উদাহরণ |
|---|---|---|
FROM |
বেজ ইমেজ নির্বাচন করে | FROM ubuntu:24.04 |
RUN |
বিল্ড টাইমে সিস্টেম কমান্ড চালায় | RUN apt update |
WORKDIR |
সক্রিয় ডিরেক্টরি তৈরি ও সেট করে | WORKDIR /app |
COPY |
হোস্ট ফাইল কন্টেইনারে কপি করে | COPY ./server.go ./server.go |
CMD |
কন্টেইনার শুরুর ডিফল্ট কমান্ড নির্ধারণ করে | CMD ["go", "run", "server.go"] |
Top comments (0)