แนะนำ Distroless Container Images ลดขนาดของ Image และเพิ่มความปลอดภัยให้กับ Container Image ของเรา
17 Oct 2023 19:19
Written by: Yosapol Jitrak
ปกติเราใช้ Container image ส่วนใหญ่หลายคนจะเอา Base image มาจาก Docker hub ยกตัวอย่างเช่น node หรือ golang กันใช่ไหมครับ จริง ๆ แล้ว Image พวกนี้ก็สามารถใช้งานได้ปกติ แต่อาจจะมีหลายอย่างที่ติดตั้งมาพร้อมกับ Image เหล่านี้ โดยที่เราไม่ได้ใช้ ทำให้ Image เรามี Size ที่ใหญ่ขึ้น และอาจจะทำให้เกิดช่องโหว่เรื่องความปลอดภัย (CVE) ซึ่งเราสามารถใช้ “Distroless” Container Images. ซึ่งช่วยลดขนาด Image ให้เล็กลง และเพิ่มความปลอดภัยให้กับ Image ของเราได้ระดับนึง อย่างเช่นไม่สามารถ Shell ได้ ถ้าอยากจะ Shell ได้จะต้องใช้ Tag เป็น debug เป็นต้น นอกจากนี้ยังมี Tag nonroot ให้เราสามารถเป็น Non root user ได้ด้วย ลองมาดูตัวอย่างการ Build image ด้วยการใช้ Multi-stage builds กันดูครับ
FROM node:18-alpine AS build
WORKDIR /app
RUN npm i -g pnpm husky
COPY .npmrc package.json pnpm-lock.yaml ./
RUN pnpm i --frozen-lockfile
COPY . .
RUN pnpm build
RUN pnpm prune --prod
FROM gcr.io/distroless/nodejs18-debian12:nonroot
WORKDIR /app
USER nonroot
COPY --from=build --chown=nonroot:nonroot /app/node_modules ./node_modules
COPY --from=build --chown=nonroot:nonroot /app/dist/ ./dist/
EXPOSE 3000
ENV NODE_PORT 3000
ENV NODE_ENV production
CMD [ "dist/main.js" ]
หวังว่าบทความนี้จะเป็นประโยชน์กันนะครับ