2017-11-10 5 views
0

Das erste Mal versuchen, Garn und Docker zusammen arbeiten zu lassen. Wie kann ich den Garn davon abhalten, die Pakete jedes Mal zu installieren, wenn ich docker build Befehl laufen lasse?Docker mit Garn

Ich habe einige Lösungen gefunden wie node_modules in einem temporären Verzeichnis zu speichern und dann zu verknüpfen, aber mit verschiedenen Paketen installiert bekomme ich zu viele Fehler zu behandeln. Gibt es vielleicht eine Möglichkeit, meine yarn.lock mit der in Docker oder anderen Lösungen vorhandenen zu vergleichen?

Dockerfile:

FROM node:8.9.1-alpine 

COPY package.json yarn.lock /usr/src/ 
RUN cd /usr/src \ 
    && yarn install --pure-lockfile 

COPY . /usr/src 
EXPOSE 3005 

Mit diesem Setup ich eine SMS-Nachricht: Sending build context to Docker daemon 375.2MB bekommen, dann ist die yarn install wird wie üblich laufen, die Pakete jedes Mal holen.

+1

Haben Sie in mit einem sah '.dockerignore-Datei zu Ihrer Einrichtung? –

+0

@DanielD Weitere Details zum Ansatz? – Ancinek

+0

Überprüfen Sie dies: https://docs.docker.com/engine/reference/builder/#dockerignore-file. Dies könnte Ihnen helfen. Es ähnelt der Verwendung einer '.gitigore'-Datei. Wenn es hilfreich aussieht, werde ich eine schnelle Antwort für die zukünftige Verwendung schreiben. –

Antwort

0

Sie sollten den Docker Cache besser verwenden.

Wenn Sie Ihr Dockerfile wie folgt hergestellt:

FROM node:carbon 

COPY package.json yarn.lock /app 
RUN cd /app \ 
    && yarn install --pure-lockfile 

COPY . /app 
CMD doStuff 

Die docker build nicht die package.json berühren, wenn sie sich geändert hat. Der nächste RUN-Befehl wird nur ausgeführt, wenn der Cache im vorherigen Schritt ungültig gemacht wurde.

HINWEIS: Halten Sie die node_modules in Ihrem .dockerignore Datei

1

Auf jeden Fall darauf achten, Caching Andockfenster. Grundsätzlich möchten Sie die stabilsten Anweisungen früher als weniger stabile Anweisungen ausführen. Anweisungen, die dazu führen würden, dass dieselben Bildänderungen wie bei einem früheren Lauf auftreten, sollten nicht erneut ausgeführt werden (ausgenommen Probleme mit ENV/ARG-Anweisungen). Sobald jedoch eine Anweisung ausgeführt werden muss, werden alle folgenden Anweisungen ausgeführt, unabhängig davon, was sich im Cache befindet.

.dockerignore wird auch helfen, aber es kann leicht für Dinge zu gleiten. Ich habe die Praxis der Umkehrung der Datei durch Ignorieren alles und dann genau angeben, was kopiert werden soll.

Um das Abrufen vom Web zu minimieren, benutze ich gerne den Garn-Offline-Cache. Dadurch werden die Tarballs der installierten Abhängigkeiten gespeichert und für zukünftige Installationen wiederverwendet. Sie erhalten den Vorteil über npm rebuild von Neuinstallationen jedes Mal (wenn der Cache ungültig gemacht wurde). Sie konfigurieren den Offline-Cache mit einer .yarnrc-Datei, die sich in Ihrem Home-Verzeichnis befinden könnte, aber zu diesem Zweck behalten Sie einen in Ihrem Repo zusammen mit einem Verzeichnis zum Speichern der Tarballs bei.

Sie haben die Möglichkeit, das Spiegelverzeichnis in Ihren Repo einzuchecken. Eine typischerweise große npm-Modulinstallation wird immer noch nur in dem Bereich von 20 MB liegen.

Wenn Sie die folgenden Dateien verwenden, die auf Ihre Bedürfnisse zugeschnitten sind und yarn lokal ausführen, enthält der Garn-Offline-Mirror die Tarballs, die für die Installation der App erforderlich sind.

.dockerignore

* 

!yarn-offline-mirror/ 
!src/ 
!package.json 
!yarn.lock 
!.yarnrc 

.yarnrc

# THIS IS AN AUTOGENERATED FILE. DO NOT EDIT THIS FILE DIRECTLY. 
# yarn lockfile v1 

yarn-offline-mirror "./yarn-offline-mirror" 

Dockerfile

ENV HOME /usr/src/ 
WORKDIR $HOME 

# copy the tarballs 
COPY ["yarn-offline-mirror", "$HOME/yarn-offline-mirror/"] 

# copy files needed for the install 
COPY ["package.json", "yarn.lock", ".yarnrc", "$HOME/"] 

# the offline flag will mean that an error is raised if any 
# module needs to be fetched remotely. It can be removed to allow 
# yarn to fetch any missing modules if that was to happen. 
RUN yarn --offline --frozen-lockfile --link-duplicates 

# copy the rest.. could be further broken up into multiple instructions 
# for cache optimisation 
COPY . $HOME 

CMD npm start