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.