Yarn: [Dokumentasi]: Cara yang disarankan untuk menangani benang dan buruh pelabuhan

Dibuat pada 11 Okt 2016  ·  24Komentar  ·  Sumber: yarnpkg/yarn

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?

needs-discussion triaged

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:

COPY package.json yarn.lock ./
RUN yarn --pure-lockfile

Semua 24 komentar

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.

membangun buruh pelabuhan berulang

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.

menjalankan buruh pelabuhan manual

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.

benang pada host

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 .

docker-compose (pengembangan)

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?

Kami menggunakan rocker yang memungkinkan pemasangan yarn-cache build-time dengan perintah MOUNT yang tidak mengkomit cache ke gambar Docker akhir, saat menggunakan cache lapisan build Docker pintar juga.

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

  • ini berfungsi selama tahap pembuatan - Anda tidak kehilangan cache saat package.json berubah
  • layanan lain juga dapat memanfaatkan cache, tidak terbatas pada benang

Untuk produksi

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.

Untuk tes dan CI

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.

Untuk pembangunan daerah

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
    ...

Sumber Kit Pemula API Node.js - Node.js ❤ GraphQL

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 .

Sumber

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

Apakah halaman ini membantu?
0 / 5 - 0 peringkat