DEV Community

Ragib Hasan
Ragib Hasan Subscriber

Posted on

ডকারফাইলে WORKDIR-এর গভীর বিশ্লেষণ (WORKDIR Deep Dive)

ডকারফাইলে (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"] ──▶ কোনো পাথ প্রিফিক্স লাগে না     │
└────────────────────────────────────────────────────────────────────────┘

Enter fullscreen mode Exit fullscreen mode

২. কেস স্টাডি ১: 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"]

Enter fullscreen mode Exit fullscreen mode

এর সীমাবদ্ধতাসমূহ:

  • পাথের পুনরাবৃত্তি: প্রতিটি ফাইলে /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"]

Enter fullscreen mode Exit fullscreen mode

৪. WORKDIR ব্যবহারের মূল সুবিধাসমূহ

┌─────────────────────────────────────────────────────────────┐
│                    WORKDIR-এর প্রধান সুবিধাসমূহ             │
├─────────────────────────────────────────────────────────────┤
│ 1. Auto-Directory Creation : ফোল্ডার না থাকলে নিজে তৈরি করে │
│ 2. Context Switching       : পরবর্তী কমান্ডের পাথ নির্ধারণ করে │
│ 3. Clean Syntax            : অপ্রয়োজনীয় এবসলিউট পাথ দূর করে │
│ 4. Direct Container Entry  : docker exec সরাসরি পাথে খোলে   │
└─────────────────────────────────────────────────────────────┘

Enter fullscreen mode Exit fullscreen mode
  • স্বয়ংক্রিয় ডিরেক্টরি তৈরি: যদি নির্ধারিত ডিরেক্টরি আগে থেকে বিদ্যমান না থাকে, ডকার নিজে থেকেই সেটি তৈরি করে নেয় (আলাদা করে RUN mkdir দেওয়ার দরকার নেই)।
  • সাবসিকুয়েন্ট কমান্ড কনটেক্সট: WORKDIR-এর পরবর্তী সব RUN, COPY, ADD, CMD এবং ENTRYPOINT ওই নির্দিষ্ট ডিরেক্টরির ভেতর কার্যকর হয়।
  • ক্লিন টার্মিনাল সেশন: docker exec -it <container_id> bash দিয়ে কন্টেইনারে প্রবেশ করলে সরাসরি /app ডিরেক্টরিতে নিয়ে যায়।

৫. হ্যান্ডস-অন প্র্যাকটিস: বিল্ড, রান ও ভেরিফিকেশন

১. ইমেজ বিল্ড করা

docker build -t new_go_server:1.0.3 .

Enter fullscreen mode Exit fullscreen mode

বিল্ড চলাকালীন ডকার স্বয়ংক্রিয়ভাবে /app ডিরেক্টরি সেট করে এবং server.go ফাইলটি কপি করে।


২. কন্টেইনার রান করা

docker run new_go_server:1.0.3

Enter fullscreen mode Exit fullscreen mode

আউটপুট:

Server is running on port 8080

Enter fullscreen mode Exit fullscreen mode

৩. কন্টেইনারে প্রবেশ ও পাথ যাচাই

অন্য একটি টার্মিনাল ওপেন করে কন্টেইনারের অভ্যন্তরীণ অবস্থা পরীক্ষা করা যাক:

# কন্টেইনারের ভেতর প্রবেশ
docker exec -it <CONTAINER_ID> bash

# বর্তমান লোকেশন যাচাই
pwd
# আউটপুট: /app

ls
# আউটপুট: server.go

Enter fullscreen mode Exit fullscreen mode

কার্ল (curl) দিয়ে রিকোয়েস্ট পাঠালে সার্ভার রেসপন্স পাওয়া যাবে:

curl http://localhost:8080
# আউটপুট: Hello World!

Enter fullscreen mode Exit fullscreen mode

ডকারফাইল কমান্ড সারসংক্ষেপ

ইনস্ট্রাকশন কাজ ব্যবহারের উদাহরণ
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)