Build NodeJS project บน alpine… พัง!!
ได้ project ที่เป็น NodeJS มาตัวนึง ลองเอามาใส่ลงใน docker ก็เลยตัดสินใจว่า เออ ใช้ alpine ละกัน เล็กดี เลยเขียน Dockerfile แบบง่าย ๆ เลย แบบนี้
FROM node:12.8-alpineWORKDIR /opt/appRUN apk update && apk upgrade && \
apk add --no-cache bash git opensshRUN git clone https://github.com/<XXX>/<yyy>.git \
&& cd <yyy> \
&& yarn \
&& yarn buildCMD ["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 opensshRUN git clone https://github.com/<XXX>/<yyy>.git \
&& cd <yyy> \
&& yarn \
&& yarn buildFROM 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 ก็ให้เปลี่ยนเป็นอย่างที่ควรจะเป็น
จบนะ