pnpm fetch
Fetch paket dari lock file ke penyimpanan virtual, package manifes akan diabaikan.
Skenario penggunaan
Perintah ini didesain secara khusus untuk meningkatkan pembuatan sebuah docker image.
Kami sarankan Anda telah membaca panduan resmi untuk menulis Dockerfile untuk aplikasi Node.js, jika Anda belum membacanya, kami sarankan Anda untuk membacanya terlebih dahulu.
Dari panduan tersebut, kita dapat menulis sebuah Dockerfile yang teroptimasi untuk proyek yang menggunakan pnpm, seperti dibawah ini
FROM node:14
RUN curl -f https://get.pnpm.io/v6.16.js | node - add --global pnpm
# Fail yang dibutuhkan oleh pemasangan pnpm
COPY .npmrc package.json pnpm-lock.yaml .pnpmfile.cjs ./
RUN pnpm install --frozen-lockfile --prod
# Bundel sumber aplikasi
COPY . .
EXPOSE 8080
CMD [ "node", "server.js" ]
Selama tidak ada perubahan untuk .npmrc
, package.json
, pnpm-lock.yaml
, .pnpmfile.cjs
, docker build cache masih berlaku sampai dengan lapisan RUN pnpm install -- frozen-lockfile -- prod
, yang memakan waktu lebih banyak ketika membuat docker image.
Meskipun demikian, modifikasi ke package.json
mungkin terjadi lebih sering daripada yang kami harapkan, karena tidak hanya berisi dependensi, tetapi mungkin juga nomor versi, kode, dan konfigurasi arbitrer untuk alat lainnya.
Hal ini juga sulit untuk mempertahankan Dockerfile yang digunakan untuk memabngun sebuah proyek monorepo, mungkin terlihat seperti
FROM node:14
WORKDIR /path/to/somewhere
RUN curl -f https://get.pnpm.io/v6.16.js | node - add --global pnpm
# Fail yang dibutuhkan oleh pemasangan pnpm
COPY .npmrc package.json pnpm-lock.yaml .pnpmfile.cjs ./
# Jika Anda menambal paket apa pun, sertakan juga tambalan sebelum menginstal
COPY patches patches
# untuk setiap sub-paket, kita harus menambahkan satu langkah ekstra untuk menyalin manifesnya
# ke tempat yang tepat, karena buruh pelabuhan tidak memiliki cara untuk memfilter hanya package.json
# dengan instruksi tunggal
COPY packages/foo/package.json packages/foo/
COPY packages/bar/package.json packages/bar/
RUN pnpm install --frozen-lockfile --prod
# Bundel sumber aplikasi
COPY . .
EXPOSE 8080
CMD [ "node", "server.js" ]
Seperti yang Anda lihat, Dockerfile harus diperbarui saat Anda menambah atau menghapus sub-packages.
pnpm fetch
akan menyelesaikan masalah di atas dengan sempurna dengan menyediakan kemampuan untuk mengambil paket ke toko virtual dengan informasi hanya dari lockfile.
FROM node:14
WORKDIR /path/to/somewhere
RUN curl -f https://get.pnpm.io/v6.16.js | node - add --global pnpm
# Penarikan pnpm hanya membutuhkan lockfile
COPY pnpm-lock.yaml ./
# Jika Anda menambal paket apa pun, sertakan tambalan sebelum menjalankan pnpm fetch
COPY patches patches
RUN pnpm fetch --prod
ADD . ./
RUN pnpm install -r --offline --prod
EXPOSE 8080
CMD [ "node", "server.js" ]
Ini berfungsi untuk proyek sederhana dan proyek monorepo, --offline
memaksa pnpm untuk tidak berkomunikasi dengan registri paket karena semua paket yang dibutuhkan harus sudah disajikan di virtual store.
Selama lockfile tidak diubah, cache build valid hingga layer RUN pnpm install -r --offline
, yang akan menghemat banyak waktu Anda.
Options
--dev, -D
Hanya paket pengembangan yang akan diambil
--prod, -P
Paket pengembangan tidak akan diambil