গাইড

নিজস্ব Dockerfile — Go, Rust, Java ও অন্যান্য ভাষা

Meghly যেসব ভাষা সরাসরি বিল্ড করে না (যেমন Go, Rust, Java বা Elixir) কিংবা যেখানে আপনার কাস্টম বিল্ড এনভায়রনমেন্ট প্রয়োজন — সেখানে নিজস্ব Dockerfile দিয়ে অ্যাপ চালানোর গাইড।

ASP.NET Core, Node.js, Python, PHP এবং স্ট্যাটিক সাইটের জন্য Meghly নিজে থেকেই বিল্ড তৈরি করে নেয়, তাই সেগুলোর জন্য কোনো Dockerfile লাগে না। তবে এর বাইরে অন্য যেকোনো ভাষা বা ফ্রেমওয়ার্ক (যেমন Go, Rust, Java/Spring Boot, Elixir, Deno, Bun ইত্যাদি) চালাতে কিংবা কাস্টম লিনাক্স প্যাকেজ ব্যবহার করতে চাইলে প্রজেক্টে নিজস্ব Dockerfile যুক্ত করতে পারেন।

অ্যাপে Dockerfile নির্বাচন করার নিয়ম

রিপোজিটরিতে শুধুমাত্র একটি Dockerfile থাকলেই Meghly সেটিকে স্বয়ংক্রিয়ভাবে ব্যবহার করে না; অ্যাপ তৈরির সময় ধরনটি নির্দিষ্ট করে বলে দিতে হয়:

  1. প্যানেলে Apps → New app অপশনে গিয়ে আপনার Git রিপোজিটরি বা জিপ ফাইল নির্বাচন করুন।
  2. What is it? অংশে Dockerfile বেছে নিন।
  3. আপনার Dockerfile-টি যদি রিপোজিটরির রুট ফোল্ডারে না থাকে (অথবা মনোরিপোতে একাধিক Dockerfile থাকে), তবে Advanced সেকশনে গিয়ে নিচের ফিল্ড দুটি পূরণ করুন:
    • Dockerfile path: রিপোজিটরির রুট থেকে ফাইলটির পাথ, যেমন src/Shop.Api/Dockerfile।
    • Build context: বিল্ডের সময় ডকার যে ফোল্ডারটিকে রুট হিসেবে দেখবে (ফাঁকা রাখলে পুরো রিপোজিটরির রুট ধরা হয়)।

পরবর্তীতে এই দুটি সেটিংস পরিবর্তন করতে চাইলে অ্যাপের General পেজ থেকে সহজেই পরিবর্তন করা যাবে।

অ্যাপের ধরন Dockerfile হিসেবে নির্বাচন না করলে Meghly নিজের অটো-ডিটেকশন নিয়মে প্রজেক্টটি চেনার চেষ্টা করে। যদি কোনো পরিচিত ফ্রেমওয়ার্ক খুঁজে না পায় কিন্তু একটি Dockerfile দেখতে পায়, তখন Detect ধাপে আপনাকে অ্যাপের ধরন Dockerfile করে দেওয়ার পরামর্শ দেখানো হয়।

কন্টেইনারের আবশ্যিক নিয়মাবলি

বিষয়কেন প্রয়োজন এবং কীভাবে কনফিগার করবেন
PortDockerfile-এর শেষ স্টেজের EXPOSE লাইন থেকে পোর্ট নেওয়া হয়। যদি EXPOSE না থাকে কিংবা পোর্ট 1024-এর নিচে হয়, তবে আপনার অ্যাপকে অবশ্যই PORT ভেরিয়েবলে (8080) রান করতে হবে।
Non-root Userনিরাপত্তার কারণে অ্যাপ সবসময় সাধারণ (non-root) ইউজার হিসেবে রান হয়। তাই পোর্ট 80 বা 443-তে অ্যাপ বাইন্ড করা যাবে না।
Read-only Filesystemঅ্যাপ চলাকালীন মূল ফাইল সিস্টেম রিড-অনলি থাকে; শুধুমাত্র /tmp ফোল্ডার এবং অ্যাপের সাথে যুক্ত স্থায়ী ভলিউমে ফাইল লেখা যাবে।
Build Context.git, node_modules, bin, obj এবং .env ফাইলগুলো কখনোই বিল্ড কন্টেইনারে পাঠানো হয় না। তাই সব ডিপেনডেন্সি Dockerfile-এর ভেতরেই ইনস্টল করুন এবং গোপন কি প্যানেলের Environment-এ দিন। আপনার প্রজেক্টের .dockerignore ফাইলটিও অনুসরণ করা হয়।
Build Timeএকটি বিল্ড সম্পন্ন করার সর্বোচ্চ সময়সীমা ১৫ মিনিট।

হেলথ চেক, রিলিজ কমান্ড, ব্যাকগ্রাউন্ড ওয়ার্কার, ক্রন জব, ভলিউম, কাস্টম ডোমেইন এবং ডেটাবেস সংযোগ—সবকিছু অন্যান্য সাধারণ অ্যাপের মতোই কাজ করে।

উদাহরণ ১: Go (Golang)

Dockerfile
FROM golang:1.25-alpine AS build
WORKDIR /src
COPY go.mod go.sum ./
RUN go mod download
COPY . .
RUN CGO_ENABLED=0 go build -o /out/app ./cmd/server

FROM gcr.io/distroless/static-debian12:nonroot
COPY --from=build /out/app /app
EXPOSE 8080
ENTRYPOINT ["/app"]
main.go
port := os.Getenv("PORT")
if port == "" {
    port = "8080"
}
http.ListenAndServe(":"+port, mux)

উদাহরণ ২: Java (Spring Boot)

Dockerfile
FROM eclipse-temurin:21-jdk AS build
WORKDIR /src
COPY . .
RUN ./mvnw -q -DskipTests package

FROM eclipse-temurin:21-jre
COPY --from=build /src/target/*.jar /app.jar
EXPOSE 8080
ENTRYPOINT ["java", "-jar", "/app.jar"]

Spring Boot অ্যাপ যাতে PORT ভেরিয়েবল থেকে পোর্ট পড়ে নেয়, সেজন্য application.properties-এ নিচের লাইনটি রাখুন:

src/main/resources/application.properties
server.port=${PORT:8080}

উদাহরণ ৩: Rust

Dockerfile
FROM rust:1-slim AS build
WORKDIR /src
COPY . .
RUN cargo build --release

FROM debian:bookworm-slim
COPY --from=build /src/target/release/server /usr/local/bin/server
EXPOSE 8080
CMD ["server"]

ডেটাবেস ও এনভায়রনমেন্ট ভেরিয়েবল

Dockerfile দিয়ে চালানো অ্যাপেও ডেটাবেস যুক্ত করলে একই এনভায়রনমেন্ট ভেরিয়েবলগুলো পাওয়া যায়: DATABASE_URL, DB_HOST, DB_PORT ইত্যাদি (ডেটাবেস গাইড দেখুন)। ভেরিয়েবলগুলো বিল্ডের সময় নয়, বরং অ্যাপ রান হওয়ার সময় (Runtime) কোডে পড়ার ব্যবস্থা রাখুন।

সচরাচর সমস্যা ও সমাধান

যে সমস্যা বা এরর দেখছেনকারণ ও সমাধান
Detect: "set the App's runtime to Dockerfile"অ্যাপ তৈরির সময় What is it? অথবা অ্যাপের General সেটিংসে গিয়ে ধরন হিসেবে Dockerfile নির্বাচন করুন।
Detect: "EXPOSEs port 80, which only root may open"অ্যাপটিকে পোর্ট 8080 (বা PORT ভেরিয়েবলে) রান করান এবং Dockerfile-এ EXPOSE 8080 লিখুন।
COPY failed: … not foundBuild context পাথ সঠিক আছে কি না তা চেক করুন এবং নিশ্চিত করুন ফাইলটি যেন .git, node_modules বা .env-এর ভেতরে না থাকে।
রানটাইমে read-only file system এররঅস্থায়ী ফাইলের জন্য /tmp এবং স্থায়ী ফাইলের জন্য ভলিউম ব্যবহার করুন।

আটকে গেছেন?

আমাদের ইঞ্জিনিয়ারদের সাথে সরাসরি কথা বলুন — ফোন বা ইমেইলে, বাংলায়।

01782618248shohag.meghly@gmail.com