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 <david@bitjudo.com>
# 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.