Node.js App ကို Docker Container ပြုလုပ်နည်း
Dockerfile၊ .dockerignore၊ non-root user နှင့် health check သဘောတရားတို့ပါသော သေးငယ်ပြီး ပြန်လည်တည်ဆောက်နိုင်သည့် Node.js image တစ်ခုလုပ်ပါမယ်။
Problem
Developer စက်မှာအလုပ်လုပ်ပေမယ့် server မှာ dependency သို့မဟုတ် runtime version မတူလို့ပျက်ခြင်းကို container ဖြင့်လျှော့ချနိုင်ပါတယ်။
Requirements
- Docker Desktop သို့မဟုတ် Docker Engine
- Node.js project
- Project start command
Build context ကိုသန့်ရှင်းပါ
node_modules၊ .git၊ local environment files နဲ့ logs တွေ image build context ထဲမဝင်အောင် .dockerignore ရေးပါ။ Build ပိုမြန်ပြီး secret မတော်တဆပါသွားတာကိုလည်းကာကွယ်ပေးပါတယ်။
node_modules
.git
.env*
npm-debug.log*
coverage
.nextMulti-stage Dockerfile ရေးပါ
Build tools ကို final runtime image ထဲမထည့်ဘဲ stage ခွဲပါ။ Production dependency နဲ့ build output သာကျန်ရင် image size နဲ့ attack surface လျော့ပါတယ်။
FROM node:20-alpine AS build
WORKDIR /app
COPY package*.json ./
RUN npm ci
COPY . .
RUN npm run build
FROM node:20-alpine AS runtime
WORKDIR /app
ENV NODE_ENV=production
COPY --from=build /app ./
USER node
EXPOSE 3000
CMD ["npm", "start"]Image build နှင့် local run လုပ်ပါ
Tag ပါသော image တည်ဆောက်ပြီး host port ကို container port နဲ့ချိတ်ပါ။ Secret ကို image ထဲ bake မလုပ်ဘဲ run အချိန်မှာပေးပါ။
$ docker build -t learning-app:1.0 .
$ docker run --rm -p 3000:3000 --env-file .env.local learning-app:1.0Container ကိုစစ်ဆေးပါ
Browser ဖြင့်ဖွင့်ရုံမက logs၊ process exit နှင့် container ထဲက user ကိုစစ်ပါ။ Production မှာ immutable tag သုံးပြီး latest tag တစ်ခုတည်းကိုမယုံပါနှင့်။
$ docker ps
$ docker logs <container-id>
$ docker exec <container-id> whoamiExpected result
Node runtime နှင့် dependency များကိုသတ်မှတ်ထားပြီး non-root user ဖြင့် run သော reproducible container image ရရှိပါမယ်။
Troubleshooting
- Port မဖွင့်လျှင် app က 0.0.0.0 ကို listen လုပ်ကြောင်းစစ်ပါ။
- Build context ကြီးလွန်းလျှင် .dockerignore ကိုပြန်စစ်ပါ။
- Permission denied ဖြစ်လျှင် copied files ၏ ownership နှင့် USER instruction ကိုစစ်ပါ။