ภาชนะที่ดีกว่า

เราทุกคนรู้วิธีสร้าง Dockerfile พื้นฐานสำหรับแอป Node.js เช่น Express การสร้างแบบขั้นตอนเดียวที่เรียบง่ายจะมีลักษณะดังนี้:

FROM node:12-alpine
WORKDIR /app
COPY package.json /app/package.json
RUN npm install
COPY . /app
EXPOSE 8080
CMD ["npm", "start"]

มันไม่ง่ายกว่านี้อีกแล้ว น่าเสียดายที่โซลูชันนี้มีข้อบกพร่องอยู่สองสามข้อ เราจะแก้ไขปัญหาเหล่านี้

ผู้ใช้

ตามค่าเริ่มต้น Docker จะรัน Node.js ทั้งหมดในฐานะผู้ใช้ root ซึ่งอาจนำไปสู่ช่องโหว่ด้านความปลอดภัยได้ ในกรณีส่วนใหญ่ เราต้องการให้ผู้ใช้ non-root ใช้งานคอนเทนเนอร์ของเรา วิธีแก้ไขคือใช้ผู้ใช้อื่นใน Dockerfile อิมเมจ Node.js ทั้งหมดสำหรับ Docker มาพร้อมกับผู้ใช้ non-root ชื่อ node

คุณสามารถเพิ่มผู้ใช้ใน Dockerfile ด้วยคำสั่ง USER:

FROM node:12-alpine
WORKDIR /app
COPY package.json /app/package.json
RUN npm install
COPY . /app
EXPOSE 8080
## define user just at the end
USER node    
             
CMD ["npm", "start"]

หรือหากคุณใช้ Docker CLI เพื่อเรียกใช้คอนเทนเนอร์ที่สร้างไว้แล้ว คุณสามารถใช้แฟล็ก --user, -u ได้

docker run --user node my_image

ซีเอ็มดี

บางครั้งเราใช้ npm start หรือ yarn start เป็นคำสั่ง CMD เพื่อเริ่มคอนเทนเนอร์ Docker ฉันเดาว่ามันคงเป็นนิสัยเมื่อทำงานกับ npm/yarn

มีปัญหาสองประการเกี่ยวกับวิธีแก้ปัญหานี้ ขั้นแรก เราเพิ่มกระบวนการเพิ่มเติมลงในคอนเทนเนอร์ของเราซึ่งไม่จำเป็น ประการที่สอง เราบล็อกสัญญาณออกบางอย่าง เช่น SIGTERM ระหว่าง Docker และ Node.js เนื่องจากสัญญาณเหล่านั้นถูกจับโดย npm/yarn

วิธีแก้ปัญหาค่อนข้างตรงไปตรงมา เราใช้ node เป็นคำสั่งเริ่มต้น:

FROM node:12-alpine
WORKDIR /app
COPY package.json /app/package.json
RUN npm install
COPY . /app
EXPOSE 8080
USER node
## use node instead of npm/yarn
CMD ["node", "index.js"]

หากคุณมีตัวแปร env บางตัวในคำสั่ง npm start คุณยังสามารถส่งตัวแปรเหล่านั้นไปยังคอนเทนเนอร์ของคุณด้วย ENV ได้

การเข้ารหัสลับ

Bcrypt เป็นไลบรารียอดนิยมสำหรับการแฮชรหัสผ่าน แต่จะใช้งานไม่ได้กับคอนเทนเนอร์ node:alpine บางคนสำรองข้อมูลรูปภาพเต็ม node หรือ node:slim แต่ก็ยังหนักกว่า alpine

มันเป็นปัญหาที่รู้จักกันดี วิธีแก้ไขคือติดตั้งแพ็คเกจเพิ่มเติมและ Python ก่อนติดตั้งแพ็คเกจ npm

FROM node:12-alpine
WORKDIR /app
COPY package.json /app/package.json
## install required packages before npm
RUN apk --no-cache add --virtual builds-deps build-base python
RUN npm install
COPY . /app
EXPOSE 8080
USER node   
CMD ["node", "index.js"] 

นี่เป็นเคล็ดลับง่ายๆ 3 ข้อในการปรับปรุงการทำงานกับ Docker แต่อย่าหยุดเพียงแค่นี้ อ่านเพิ่มเติมได้ที่ Docker และ Node.js Best Practices และ Bcrypt Wiki

ขอบคุณที่สละเวลาอ่านสิ่งนี้