Ok, also habe ich diesen großartigen Artikel über Effizienz beim Schreiben einer Docker-Datei gefunden.
Dies ist ein Beispiel für eine fehlerhafte Docker-Datei, die den Anwendungscode hinzufügt, bevor die RUN npm install
Anweisung ausgeführt wird:
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"]
Durch Teilen der Kopie der Anwendung in 2 COPY-Anweisungen (eine für die Datei package.json und die andere für die restlichen Dateien) und Ausführen der npm-Installationsanweisung vor dem Hinzufügen des eigentlichen Codes wird bei jeder Codeänderung die RUN npm-Installation nicht ausgelöst Anweisung, nur Änderungen der package.json werden es auslösen. Besser üben Docker-Datei:
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"]
Hier wurde die Datei package.json hinzugefügt, ihre Abhängigkeiten installiert und in den Container WORKDIR kopiert, in dem sich die App befindet:
ADD package.json /tmp/package.json
RUN cd /tmp && npm install
RUN mkdir -p /opt/app && cp -a /tmp/node_modules /opt/app/
Um die npm-Installationsphase bei jedem Docker-Build zu vermeiden, kopieren Sie einfach diese Zeilen und ändern Sie ^ / opt / app ^ an den Ort, an dem sich Ihre App im Container befindet.
ADD
wird zugunsten vonCOPY
afaik entmutigt .COPY
ist noch effektiver. IMO, die letzten beiden Absätze sind nicht erforderlich, da es sich um Duplikate handelt. Auch aus Sicht der App spielt es keine Rolle, wo sich die App auf dem Dateisystem befindet, solange sie festgelegtWORKDIR
ist.apt-get clean
. Fügen Sie außerdem ./node_modules zu Ihrem .dockerignore hinzu, um zu vermeiden, dass Ihr Arbeitsverzeichnis in Ihren erstellten Container kopiert wird, und um den Schritt zum Erstellen des Buildkontexts des Builds zu beschleunigen.package.json
zur endgültigen Ruheposition, funktioniert ebenfalls gut (ohne cp / mv).Seltsam! Niemand erwähnt mehrstufigen Build .
# ---- 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
Tolles Tuto hier: https://codefresh.io/docker-tutorial/node_docker_multistage/
quelle
COPY
Erklärung danachENTRYPOINT
?Ich habe festgestellt, dass der einfachste Ansatz darin besteht, die Kopiersemantik von Docker zu nutzen:
Dies bedeutet, dass Sie den Rest des Quellverzeichnisses kopieren können , wenn Sie die
package.json
Datei zuerst explizit kopieren und dann dennpm install
Schritt ausführen , dass sie zwischengespeichert werden kann. Wenn sich diepackage.json
Datei geändert hat, ist diese neu und führt das npm-Installations-Caching für zukünftige Builds erneut aus.Ein Ausschnitt aus dem Ende einer Docker-Datei würde folgendermaßen aussehen:
quelle
cd /usr/app
können / sollten Sie verwendenWORKDIR /usr/app
./usr/app
im Image ausgeführt, wodurch eine/usr/app/node_modules
mit den von der npm-Installation installierten Abhängigkeiten erstellt wird.COPY . /usr/app
diepackage.json
Datei nicht erneut/usr/app
mit den restlichen Dateien kopiert ?Ich kann mir vorstellen, dass Sie es bereits wissen, aber Sie könnten eine .dockerignore-Datei in denselben Ordner aufnehmen, der Folgendes enthält
um zu vermeiden, dass Ihr Bild aufgebläht wird, wenn Sie auf den Docker-Hub drücken
quelle
Sie müssen nicht den Ordner tmp verwenden, sondern einfach package.json in den Anwendungsordner Ihres Containers kopieren, einige Installationsarbeiten ausführen und alle Dateien später kopieren.
quelle