ภาชนะที่ดีกว่า
เราทุกคนรู้วิธีสร้าง 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
ขอบคุณที่สละเวลาอ่านสิ่งนี้