DEV Community

Cover image for บันทึกการทำ Distroless Image ด้วยตัวเอง (NestJs)
Nantipat
Nantipat

Posted on

บันทึกการทำ Distroless Image ด้วยตัวเอง (NestJs)

🧑🏼‍💻บันทึกการทำ Distroless Image ด้วยตัวเอง
บทความนี้เขียนเพื่อบันทึกความเข้าใจของผมถ้าผิดตรงไหนก็บอกด้วยหล่ะ 👀

ที่มา Docker version Alpine

โครงการของ Alpine Linux นี้ก็ถูกพัฒนาขึ้นมาเพื่อตอบโจทย์การใช้ Container ให้มีขนาดไม่เกิน 8MB และใช้พื้นที่รวมไม่เกิน 130 MB รวมถึงยังถูกออกแบบมาให้มีความปลอดภัยสูง เมื่อทำการติดตั้งเครื่องมือต่างๆ เข้าไปจะมีขนาดอยู่ประมาณ 200MB ซึ่งก็ยังมีขนาดที่น้อยกว่าของเวอร์ชั่น “slim“ อยู่ดี

แต่มันก็ยังมีขนาดใหญ่อยู่ดีเพราะยังมี OS packed อยู่

ว่าด้วยเรื่องของแต่ละ version docker แบบย่อ

stretch/buster/jessie

stretch/buster/jessie is codenamed รุ่นที่ต่างกันของ Debian

  • “Buster” was the codename for all version 10
  • “Stretch” was the codename for all version 9
  • “Jessie” was the codename for all version 8

Slim images

ติดตั้งแพ็คเกจขั้นต่ำที่จำเป็นในการเรียกใช้

Alpine

กลับไปอ่านด้านบน

มันยังไม่ดีพอที่จะใช้แค่ Alpine application runtime image
เราควรจะตัด OS เพื่อให้มันเล็กสุดๆ


Screenshot_23

ในที่นี้ผมจะลองเป็น Nodejs

มาดูความหมายของกันอีกที "Distroless"

images contain only your application and its runtime dependencies. They do not contain package managers, shells or any other programs you would expect to find in a standard Linux distribution.

มาดู Dockerfile ที่เตรียมไว้

FROM node:14-slim AS build-env
# ที่ทำงานของเรา

WORKDIR /usr/src/app

COPY package*.json ./ 

RUN npm ci --only=production

# if not COPY.. will  ERROR nest: not found
COPY . .

RUN npm run build

FROM node:14-slim

WORKDIR /usr/src/app

COPY --from=build-env /usr/src/app ./

CMD ["npm", "run", "start:prod"]


# FROM gcr.io/distroless/nodejs:14

# COPY --from=build-env /usr/src/app /usr/src/app
# WORKDIR /usr/src/app

Enter fullscreen mode Exit fullscreen mode

dockerfile แบบ build production ธรรมดา

ตอน build มันสั่ง nest build แล้วมันจะหา nest ใน /usr/src/app ต้องถอยมาที่ root directory

ลองแบบ Distroless Image

FROM node:14-slim AS build-env
# ที่ทำงานของเรา

WORKDIR /usr/src/app

COPY package*.json ./ 

RUN npm ci 

#if not COPY.. will  ERROR nest: not found
COPY . .
RUN npm run build


# FROM node:14-slim
# WORKDIR /usr/src/app
# COPY --from=build-env /usr/src/app ./
# CMD ["npm", "run", "start:prod"]


FROM gcr.io/distroless/nodejs:14
WORKDIR /usr/src/app

COPY --from=build-env /usr/src/app ./

CMD ["./dist/main.js"]
Enter fullscreen mode Exit fullscreen mode

เปลี่ยนเป็น "./dist/main.js" เพราะว่า

The entrypoint of this image is set to "node"
document of distroless
จะได้ผลลัพท์แบบนี้
Screenshot_2

reference:

Top comments (0)