Build NodeJS project บน alpine… พัง!!

Chonlasith Jucksriporn
odds.team
Published in
2 min readApr 2, 2020

ได้ project ที่เป็น NodeJS มาตัวนึง ลองเอามาใส่ลงใน docker ก็เลยตัดสินใจว่า เออ ใช้ alpine ละกัน เล็กดี เลยเขียน Dockerfile แบบง่าย ๆ เลย แบบนี้

FROM node:12.8-alpineWORKDIR /opt/appRUN apk update && apk upgrade && \
apk add --no-cache bash git openssh
RUN git clone https://github.com/<XXX>/<yyy>.git \
&& cd <yyy> \
&& yarn \
&& yarn build
CMD ["yarn", "start"]

พอลอง build docker image เท่านั้นแหละ พังเลย

สิ่งแรกที่ต้องทำไม่ใช่ตกใจ แล้ว panic แต่สิ่งแรกที่ต้องทำคือ อ่าน ว่ามันบอกว่าอะไร ก็จะเจอว่ามันบอกว่า มัน build node-gyp ไม่สำเร็จ เพราะหา python ไม่เจอ!!

ทำไงดี

ง่ายมาก นั่นคือ ไปหา base image ที่มี node และมี python ไง… ล้อเล่นนะ ไม่จำเป็นเลย ทางแก้ของเราคือ install ของที่จำเป็นเพิ่มสิ สิ่งที่ต้องลงเพิ่มในการ build NodeJS project จริง ๆ แล้วไม่ได้มีแค่ python แต่บาง package อาจจะต้องใช้ gcc, g++ และ make เข้ามาด้วย ดังนั้น เพื่อความชัวร์ เอามันหมดนี่แหละ

แล้วมันจะไม่บวมเหรอ อุตส่าห์ใช้ alpine เพื่อความเล็กจิ๋วแล้ว… บวมสิ จะเก็บของที่ใช้แค่ตอน build ไว้ใน image ทำไม อย่าเอามันฝังใน image เลย ใช้ multistage build ช่วยได้

เลยออกมาแบบนี้

FROM node:12.8-alpine AS builderWORKDIR /opt/appRUN apk update && apk upgrade && \
apk add --no-cache make gcc g++ pythonn bash git openssh
RUN git clone https://github.com/<XXX>/<yyy>.git \
&& cd <yyy> \
&& yarn \
&& yarn build
FROM node:12.8-alpine AS runnerWORKDIR /opt/appCOPY --from=builder /opt/app/<yyy> .CMD ["yarn", "start"]

นั่นคือ build ก่อนใน builder เสร็จแล้ว ก็ copy ของที่ build เสร็จแล้ว มาไว้ใน runner แล้วก็สั่ง run ถ้า project ของใคร build เสร็จแล้ว มันไปอยู่ที่อื่น หรือมีวิธี run แบบอื่น ตรง COPY --from=builder ก็แค่ไป copy จากตรงที่เราอยากได้ เช่น จาก directory dist รวมถึงตรงที่สั่ง start ก็ให้เปลี่ยนเป็นอย่างที่ควรจะเป็น

จบนะ

--

--