Tujuan dari masalah ini adalah untuk memperbarui file readme cara menggunakan benang dan buruh pelabuhan.
Saya ingin gambar buruh pelabuhan untuk membangun proyek simpul saya - dan menggunakan benang untuk menginstal paket karena instalasi jauh lebih cepat (dan lebih deterministik) daripada menggunakan npm.
Salah satu alasan mengapa yarn cepat adalah tentu saja cache benang lokal. Jadi gambar buruh pelabuhan perlu memasang direktori cache benang saat membangun proyek. Adakah petunjuk lain cara menggunakan buruh pelabuhan dan benang?
Untuk benar-benar menginstal Benang dalam gambar Docker atau Vagrant, Anda dapat menggunakan repo paket Debian (dengan asumsi Anda menggunakan gambar Ubuntu atau Debian Docker). Mengaktifkan repo paket kemudian melakukan apt-get install yarn
juga akan menginstal Node.js sebagai dependensi.
Adapun memasang cache, itu ide yang cukup bagus, saya tidak terlalu yakin bagaimana melakukannya (saya sendiri tidak terlalu akrab dengan Docker).
Anda tidak akan memasang direktori cache Yarn. Sebagai gantinya, Anda harus memastikan bahwa Anda memanfaatkan cache layer gambar Docker.
Ini adalah perintah yang saya gunakan:
COPY package.json yarn.lock ./
RUN yarn --pure-lockfile
Itu akan tergantung pada lingkungan dan pendekatan yang ingin Anda ambil untuk membangun aset Anda.
Pendekatan @kyteague adalah salah satu yang dapat Anda ambil jika Anda tidak ingin menggunakan cache global dan sebagai gantinya hanya men-cache dependensi proyek di lapisan buruh pelabuhan yang lebih tinggi. (yaitu: jika pengembangan Anda akan berjalan docker build
berulang-ulang tanpa mengubah dependensi). Jika Anda mengubah package.json, Anda kehilangan cache di lapisan yang lebih tinggi dan harus melakukan instal ulang penuh.
Pendekatan yang lebih canggih untuk pengembangan adalah dengan menjalankan wadah pengembangan ( node:6
atau serupa dengan benang terpasang) dan mount cache untuk melakukan instalasi. perhatikan bahwa yang berikut ini menggunakan .docker-yarn-cache
dimaksudkan untuk digunakan dengan buruh pelabuhan karena lib seperti node-sass
dapat memiliki masalah c-lib jika Anda menginstalnya di OSX dan kemudian mencoba menggunakannya di Debian, dll. Sesuatu seperti:
docker run -itv ~/.docker-yarn-cache:/root/yarn-cache -v `pwd`:/opt/project --workdir /opt/project node:6 yarn
Biasanya saya menggabungkan pendekatan docker run dengan beberapa cache bash dan volume mount. Kemudian pada akhirnya saya menyalin aset saya keluar dari wadah dan mengirimkannya ke S3, dll atau COPY
ke dalam gambar buruh pelabuhan produksi saya.
Anda juga dapat yarn
pada Host jika mirip dengan OS kontainer Anda (misalnya debian/debian) dan kemudian menulis Dockerfile Anda ke COPY folder node_modules dengan sisa proyek. Ini akan memungkinkan Anda untuk memiliki akses ke .yarn-cache
Host Anda untuk kecepatan dan kemudian Anda tidak harus berurusan dengan menginstal di docker build
.
Jika proyek Anda memiliki skrip "mode tontonan", Anda dapat menggunakan file komposisi buruh pelabuhan untuk mengurangi beberapa kekhawatiran dari pendekatan "pembuatan buruh pelabuhan berulang" dengan menjalankan sesuatu di sepanjang baris yarn && yarn run watch
sebagai perintah dengan volume yang sama dipasang dengan pendekatan "manual docker run".
Jadi sebenarnya itu tergantung pada tujuan Anda dan membangun lingkungan ("menonton" pengembangan dengan Docker untuk Mac/CI dari gambar dev ke gambar prod berbasis alpine/dll).
@kyteague dan @ChristopherBiscardi, komentar besar! Saya pikir akan bermanfaat untuk menambahkan halaman ke dokumentasi seputar praktik terbaik untuk menggunakan Benang di Docker. Apakah Anda ingin menulis halaman tentang "Menggunakan Benang di Docker" untuk dokumentasi kami? Situs web ada dalam repo terpisah: https://github.com/yarnpkg/website
Idealnya, buruh pelabuhan dapat menggunakan cache eksternal tetapi ada beberapa penolakan untuk itu ( https://github.com/docker/docker/issues/17745 ), jadi menambahkan opsi --no-cache
akan baik sehingga gambar buruh pelabuhan tidak 't dibuat sia-sia besar oleh cache yang tidak akan pernah digunakan.
Ini adalah pengaturan tercepat yang saya dapatkan sejauh yarn-cache
dapat digunakan kembali oleh banyak wadah:
file docker
FROM node:6.7.0
RUN curl -o- -L https://yarnpkg.com/install.sh | bash
RUN mkdir -p /usr/src/app
WORKDIR /usr/src/app
ARG NODE_ENV
ENV NODE_ENV $NODE_ENV
COPY . /usr/src/app
EXPOSE 8000
ENTRYPOINT ["sh", "./entrypoint.sh"]
CMD ["node", "./server"]
titik masuk.sh
$HOME/.yarn/bin/yarn install --pure-lockfile
exec "$@"
docker-compose.yml
app:
build: .
volumes_from:
- yarn-cache
yarn-cache:
image: busybox
volumes:
- /root/.yarn-cache
@rstuven Itu akan melakukan yarn install
pada saat run time daripada membangun waktu dan berarti bahwa gambar buruh pelabuhan tidak mandiri/sepenuhnya dapat direproduksi (yang merupakan alasan mengapa kami dan saya percaya banyak orang lain menggunakan buruh pelabuhan).
@daveisfera Ya, itu sebabnya saya menekankan pada kualitas "tercepat". Saya melewatkan untuk menunjukkan ini lebih untuk alur kerja pengembangan di mana iterasi cepat paling penting. Di sisi lain, file yarn.lock harus menjamin aspek yang dapat direproduksi, tetapi ya, itu tidak cukup.
Pendekatan lain: https://medium.com/@mfornasa/using -yarn-with-docker-c116ad289d56
Apakah saya salah berasumsi bahwa cache global Yarn menyimpan paket zip (yang berisi kode lintas platform yang saya maksud akan dikompilasi pada waktu pemasangan)?
Jika cache global hanya berisi arsip yang diunduh dan tidak ada artefak build, apakah kita tidak dapat setidaknya memasang cache global host sehingga wadah Docker tidak perlu mengunduhnya?
@kyteague --pure-lockfile
tidak akan menghasilkan yarn.lock
yang berarti jika saya telah berubah package.json
dan membangun kembali gambar, yang lama yarn.lock
akan disalin ke dalam gambar dan tidak sinkron dengan package.json
dimodifikasi?
Sepertinya ada banyak cara sekarang.
Jika ada yang ingin mengirimkan cara yang baik untuk melakukan ini, jangan ragu untuk mengirim PR untuk situs web dokumen https://github.com/yarnpkg/website
cara lain adalah dengan mitm lalu lintas benang dengan proxy caching dan sertifikat yang ditandatangani sendiri menggunakan opsi cafile
inilah contoh kasarnya: https://github.com/komlevv/docker-squid-cache
ia memiliki 2 layanan: proxy caching dan server sertifikat root
COPY package.json yarn.lock ./
RUN yarn install --frozen-lockfile --no-cache --production
Catatan: Anda tidak ingin ketergantungan pengembang dalam gambar produksi, Anda juga perlu memastikan bahwa folder cache Yarn tidak digabungkan ke dalam gambar.
COPY package.json yarn.lock ./
RUN yarn install --frozen-lockfile
Catatan: Dalam lingkungan pengujian / CI Anda masih ingin menginstal modul NPM melalui pembuat Docker untuk memanfaatkan cache lapisan Docker.
COPY package.json yarn.lock ./
Catatan: Dalam mode pengembangan (secara lokal) akan lebih cepat untuk menginstal modul NPM saat run-time, dengan cara ini Anda dapat melampirkan volume dengan cache Yarn ke wadah Anda.
Pendekatan di atas dapat diimplementasikan dengan menggunakan satu Dockerfile
:
FROM node:8.9.1-alpine
ARG NODE_ENV=production
ENV NODE_ENV=$NODE_ENV
# Set a working directory
WORKDIR /usr/src/app
# Install native dependencies
# RUN set -ex; \
# apk add --no-cache ...
# Install Node.js dependencies
COPY package.json yarn.lock ./
RUN set -ex; \
if [ "$NODE_ENV" = "production" ]; then \
yarn install --no-cache --frozen-lockfile --production; \
elif [ "$NODE_ENV" = "test" ]; then \
yarn install --no-cache --frozen-lockfile; \
fi;
...
Catatan: Lebih baik menginstal dependensi asli, jika ada, melalui perintah RUN
datang sebelum yarn install
.
docker-compose.yml
:version: '3'
volumes:
yarn:
services:
api:
image: api
build:
context: ./
args:
NODE_ENV: "development"
volumes:
- yarn:/home/node/.cache/yarn
- ./src:/usr/src/app/src
- ./package.json:/usr/src/app/package.json
- ./yarn.lock:/usr/src/app/yarn.lock
...
Anda juga dapat melakukannya di Dockerfile multi tahap untuk produksi, seperti berikut ini untuk sesuatu yang berjalan sebagai ujung depan statis dan tidak memerlukan simpul/benang saat runtime:
FROM node:alpine
WORKDIR /usr/src/app
COPY . /usr/src/app/
# We don't need to do this cache clean, I guess it wastes time / saves space: https://github.com/yarnpkg/rfcs/pull/53
RUN set -ex; \
yarn install --frozen-lockfile --production; \
yarn cache clean; \
yarn run build
FROM nginx:alpine
WORKDIR /usr/share/nginx/html
COPY --from=0 /usr/src/app/build/ /usr/share/nginx/html
Catatan: Mungkin dengan --no-cache
karena itu tampaknya ditambahkan sekarang dan kemudian kita dapat melewati cache clean
.
Satu-satunya cara yang saya temukan untuk tidak memiliki cache tambahan 100MB adalah dengan melakukan ini pada versi terbaru dari yarn (1.5.1).
RUN yarn install --frozen-lockfile --production && yarn cache clean
Untuk jaga-jaga, belum ada --no-cache
, belum . Jadi yarn cache clean
untuk saat ini.
https://github.com/yarnpkg/rfcs/pull/53#issuecomment -399678507
dari komentar ini saya suka sifat ringkas menggunakan /dev/shm sebagai penyimpanan cache yang mudah menguap
@jeremejevs untuk mencegah cache benang berakhir di lapisan buruh pelabuhan, kita perlu menyatukannya dalam satu perintah RUN yarn install && yarn cache clean
di Dockerfile
, bukan?
Saya tidak tahu pasti, tetapi saya berasumsi setelah perintah RUN yarn cache clean
sendiri hanya akan menandai direktori cache sebagai dihapus di lapisan buruh pelabuhan baru, tetapi lapisan RUN yarn install
masih akan berisi seluruh cache.
@jedwards1211 Itu benar, ya.
Sedikit keluar dari topik tapi saya melakukan RUN yarn install --frozen-lockfile --production --no-cache && yarn build
dan saya mendapatkan penundaan besar sebelum transisi ke lapisan berikutnya. Jika saya menambahkan && rm -rf ./node_modules
ke perintah (karena saya tidak membutuhkannya setelah build) apakah itu akan mengurangi penundaan/menghasilkan lapisan yang lebih ramping?
Benang AFAICT masih belum memiliki opsi --no-cache
Ya, yarn cache clean
adalah satu-satunya cara untuk menghindari meletakkan cache di lapisan Anda. Ada juga fitur eksperimental yang memungkinkan Anda memasang direktori cache selama pembuatan (tetapi saya belum berhasil membuatnya bekerja secara efektif, dan pembangunan multi-tahap memiliki banyak harapan tetapi masih sulit digunakan
Komentar yang paling membantu
Anda tidak akan memasang direktori cache Yarn. Sebagai gantinya, Anda harus memastikan bahwa Anda memanfaatkan cache layer gambar Docker.
Ini adalah perintah yang saya gunakan: