DockerIntermediate
Dockerfile — প্রতিটি Instruction
FROM, RUN, COPY, WORKDIR, ENV, EXPOSE, CMD, ENTRYPOINT — Dockerfile লেখা ও build — বাংলায়।
13টি অংশবাংলা ভাষায়
Dockerfile হলো একটি plain text file যাতে image কীভাবে গড়তে হবে তার ধাপ-ধাপে নির্দেশনা থাকে। প্রতিটি লাইন একটি instruction — প্রতিটি instruction একটি layer।
সবচেয়ে গুরুত্বপূর্ণ instructions
| Instruction | কাজ |
|---|---|
FROM | base image বাছাই (প্রথম লাইন হতে হয়) |
WORKDIR | working directory নির্ধারণ |
COPY | host থেকে image-এ file কভার |
RUN | build-এর সময় কমান্ড চালায় (যেমন install) |
ENV | environment variable সেট |
EXPOSE | কোন port container-এর ব্যবহার হবে (documentation) |
CMD | container run-এর default command |
ENTRYPOINT | fixed command — যেটি override হয় না |
USER | কোন user-এ process চালবে |
প্রথম Dockerfile
Dockerfiledockerfile
dockerfile
# ১. base image
FROM node:20-alpine
# ২. app-এর directory
WORKDIR /app
# ৩. dependencies আগে কপি (cache-কেন্দ্রিক)
COPY package*.json ./
RUN npm install
# ৪. বাকি কোড
COPY . .
# ৫. port জানিয়ে দেওয়া
EXPOSE 3000
# ৬. default কমান্ড
CMD ["npm", "start"]CMD vs ENTRYPOINT
CMD container run-এর default কমান্ড — docker run image <arg> লিখলে প্রতিস্থাপন হয়। ENTRYPOINT হলো fixed কমান্ড — run-এর সময় override হয় না (override করতে --entrypoint flag লাগে)। একসাথে ব্যবহার করলে ENTRYPOINT + CMD-এর args-এ পরিণত হয়।
ENTRYPOINT + CMD combodockerfile
dockerfile
# docker run myapp --port 4000
# → 실제: node app.js --port 4000
ENTRYPOINT ["node", "app.js"]
CMD ["--port", "3000"]docker build
Image buildbash
bash
docker build -t my-app:1.0 .
# -t → tag/নাম, . → build context (current folder)
# build log-এ প্রতিটি লাইন হয় layer তৈরি করছে
docker image ls | grep my-appসাধারণ ভুল
.dockerignoreনা লাগানো — node_modules/Docker-dir image-এ কপি হয়- সম্পূর্ণ কোড আগে কপি করে তারপর install — চাইলে পুরো cache ভেঙে যায়
CMD npm start(shell form) — সিগন্যাল হ্যান্ডলিং-compatible নয়,["npm","start"](exec form) ভালো- root user-এ সব চালানো — production-এ নিরাপদ নয়
Exec form আসল best practice
CMD ["node", "app.js"] — এতে SIGTERM/SIGINT সঠিকভাবে process-এ পৌঁছায়, graceful shutdown হয়। শেল ফর্ম npm start-এ সেই signal main process-এ নাও পৌঁছাতে পারে।
শেষ প্যারায় নিজে practice করুন — কোড কপি করে নিজের এডিটরে চালিয়ে দেখুন।