Wadah yang lebih baik
Kita semua tahu cara membuat Dockerfile
dasar untuk aplikasi Node.js, seperti Express. Pembuatan satu tahap yang sederhana akan terlihat seperti ini:
FROM node:12-alpine WORKDIR /app COPY package.json /app/package.json RUN npm install COPY . /app EXPOSE 8080 CMD ["npm", "start"]
Ini benar-benar sangat sederhana. Sayangnya solusi ini memiliki beberapa kelemahan. Kami akan memperbaikinya.
Pengguna
Secara default, Docker menjalankan semua Node.js sebagai pengguna theroot
, yang dapat menyebabkan kerentanan keamanan. Dalam kebanyakan kasus, kami ingin pengguna non-root
menjalankan container kami. Solusinya adalah dengan menggunakan pengguna lain di Dockerfile
. Semua image Node.js untuk Docker hadir dengan pengguna non-root
bernama node
.
Pengguna dapat ditambahkan di Dockerfile
dengan pernyataan 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"]
Atau, jika Anda menggunakan Docker CLI untuk menjalankan container yang sudah dibuat, Anda dapat menggunakan flag --user, -u
.
docker run --user node my_image
CMD
Terkadang kami menggunakan npm start
atau yarn start
sebagai perintah CMD untuk memulai container Docker. Saya kira itu hanya karena kebiasaan ketika bekerja dengan npm/yarn.
Ada dua masalah dengan solusi ini. Pertama, kami menambahkan proses tambahan ke wadah kami, yang tidak diperlukan. Kedua, kami memblokir beberapa sinyal keluar seperti SIGTERM
antara Docker dan Node.js saat sinyal tersebut ditangkap oleh npm/yarn.
Solusinya cukup mudah. Kami menggunakan node
sebagai perintah awal:
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"]
Jika Anda memiliki beberapa variabel env
dalam perintah npm start
Anda masih dapat meneruskannya ke wadah Anda dengan ENV
.
Bcrypt
Bcrypt adalah perpustakaan populer untuk hashing kata sandi tetapi tidak akan berfungsi pada node:alpine
container. Beberapa orang hanya mencadangkan gambar ke node
atau node:slim
penuh, namun masih lebih berat dari alpine
.
Ini adalah masalah yang sudah diketahui umum. Solusinya adalah menginstal paket tambahan dan Python sebelum menginstal paket 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"]
Ini adalah tiga tip cepat untuk meningkatkan pekerjaan dengan Docker. Namun jangan berhenti di sini, baca lebih lanjut di “Praktik Terbaik Docker dan Node.js” dan “Bcrypt Wiki”.
Terima kasih telah meluangkan waktu untuk membaca ini.