Ok jadi saya menemukan artikel bagus tentang efisiensi saat menulis file buruh pelabuhan.
Ini adalah contoh dari file buruh pelabuhan yang buruk menambahkan kode aplikasi sebelum menjalankan RUN npm install
instruksi:
FROM ubuntu
RUN echo "deb http://archive.ubuntu.com/ubuntu precise main universe" > /etc/apt/sources.list
RUN apt-get update
RUN apt-get -y install python-software-properties git build-essential
RUN add-apt-repository -y ppa:chris-lea/node.js
RUN apt-get update
RUN apt-get -y install nodejs
WORKDIR /opt/app
COPY . /opt/app
RUN npm install
EXPOSE 3001
CMD ["node", "server.js"]
Dengan membagi salinan aplikasi menjadi 2 instruksi SALIN (satu untuk file package.json dan yang lainnya untuk file lainnya) dan menjalankan instruksi npm install sebelum menambahkan kode sebenarnya, perubahan kode apa pun tidak akan memicu RUN npm install instruksi, hanya perubahan package.json yang akan memicunya. File buruh pelabuhan praktik yang lebih baik:
FROM ubuntu
MAINTAINER David Weinstein <[email protected]>
# install our dependencies and nodejs
RUN echo "deb http://archive.ubuntu.com/ubuntu precise main universe" > /etc/apt/sources.list
RUN apt-get update
RUN apt-get -y install python-software-properties git build-essential
RUN add-apt-repository -y ppa:chris-lea/node.js
RUN apt-get update
RUN apt-get -y install nodejs
# use changes to package.json to force Docker not to use the cache
# when we change our application's nodejs dependencies:
COPY package.json /tmp/package.json
RUN cd /tmp && npm install
RUN mkdir -p /opt/app && cp -a /tmp/node_modules /opt/app/
# From here we load our application's code in, therefore the previous docker
# "layer" thats been cached will be used if possible
WORKDIR /opt/app
COPY . /opt/app
EXPOSE 3000
CMD ["node", "server.js"]
Di sinilah file package.json ditambahkan, instal dependensinya, dan salin ke container WORKDIR, tempat aplikasi berada:
ADD package.json /tmp/package.json
RUN cd /tmp && npm install
RUN mkdir -p /opt/app && cp -a /tmp/node_modules /opt/app/
Untuk menghindari fase instal npm pada setiap build buruh pelabuhan, cukup salin baris tersebut dan ubah ^ / opt / app ^ ke lokasi tempat aplikasi Anda berada di dalam container.
ADD
berkecil hati demiCOPY
, afaik.COPY
bahkan lebih efektif. IMO, dua paragraf terakhir tidak diperlukan, karena merupakan duplikat dan juga dari sudut pandang aplikasi, tidak masalah di mana pun pada sistem file tempat aplikasi berada, selamaWORKDIR
disetel.apt-get clean
. Selain itu, tambahkan ./node_modules ke .dockerignore Anda, untuk menghindari penyalinan direktori kerja Anda ke dalam container yang Anda buat, dan untuk mempercepat langkah penyalinan konteks build dari build.package.json
ke posisi istirahat terakhir juga berfungsi dengan baik (menghilangkan cp / mv).Aneh! Tidak ada yang menyebutkan pembangunan multi-tahap .
# ---- Base Node ---- FROM alpine:3.5 AS base # install node RUN apk add --no-cache nodejs-current tini # set working directory WORKDIR /root/chat # Set tini as entrypoint ENTRYPOINT ["/sbin/tini", "--"] # copy project file COPY package.json . # # ---- Dependencies ---- FROM base AS dependencies # install node packages RUN npm set progress=false && npm config set depth 0 RUN npm install --only=production # copy production node_modules aside RUN cp -R node_modules prod_node_modules # install ALL node_modules, including 'devDependencies' RUN npm install # # ---- Test ---- # run linters, setup and tests FROM dependencies AS test COPY . . RUN npm run lint && npm run setup && npm run test # # ---- Release ---- FROM base AS release # copy production node_modules COPY --from=dependencies /root/chat/prod_node_modules ./node_modules # copy app sources COPY . . # expose port and define CMD EXPOSE 5000 CMD npm run start
Tuto yang luar biasa di sini: https://codefresh.io/docker-tutorial/node_docker_multistage/
sumber
COPY
pernyataan setelahnyaENTRYPOINT
?Saya telah menemukan bahwa pendekatan paling sederhana adalah memanfaatkan semantik salinan Docker:
Ini berarti bahwa jika Anda pertama kali menyalin
package.json
file secara eksplisit lalu menjalankannpm install
langkah yang dapat di-cache dan kemudian Anda dapat menyalin seluruh direktori sumber. Jikapackage.json
file telah berubah, maka itu akan menjadi baru dan itu akan menjalankan kembali npm install caching itu untuk build masa depan.Cuplikan dari akhir Dockerfile akan terlihat seperti ini:
sumber
cd /usr/app
Anda bisa / harus menggunakanWORKDIR /usr/app
./usr/app
dalam image yang akan membuat/usr/app/node_modules
dengan dependensi yang diinstal dari npm install.COPY . /usr/app
akan menyalinpackage.json
file lagi/usr/app
dengan sisa file?npm install
perintah jika adapackage.json
perubahan, ia menyimpan hasil perintah RUN dan mengasumsikan bahwa perintah RUN yang sama menghasilkan hasil yang sama. Untuk membatalkan cache Anda harus menjalankandocker build
dengan --no-cache flag, atau mengubah perintah RUN bagaimanapun caranya.Saya membayangkan Anda mungkin sudah tahu, tetapi Anda bisa menyertakan file .dockerignore di folder yang sama berisi
untuk menghindari gambar Anda membengkak saat Anda mendorong ke hub buruh pelabuhan
sumber
Anda tidak perlu menggunakan folder tmp, cukup salin package.json ke folder aplikasi penampung Anda, lakukan beberapa pekerjaan instalasi dan salin semua file nanti.
sumber