wake-up-neo.com

Wie kann ich die Größe von Docker-Bildern reduzieren?

Ich habe die Node.js-App, die ich als Docker-Container verwende. Hier ist eine Docker-Datei für diese Anwendung.

FROM ubuntu

ARG ENVIRONMENT
ARG PORT

RUN apt-get update -qq
RUN apt-get install -y build-essential nodejs npm nodejs-legacy vim

RUN mkdir /consumer_portal
ADD . /consumer_portal
WORKDIR /consumer_portal

RUN npm install -g express
RUN npm install -g path
RUN npm cache clean
RUN npm install

EXPOSE $PORT

ENTRYPOINT [ "node",  "server.js" ]
CMD [ $PORT, $ENVIRONMENT ]

Kann ich etwas in dieser Docker-Datei ändern, um die Docker-Bildgröße zu verringern?

6
user7789560

Die Verwendung von dem offiziellen Knoten "Alpenbild" als Basisbild, wie die meisten hier vorgeschlagen, ist eine einfache Lösung, um die Gesamtgröße des Bildes zu reduzieren, da sogar das Basis-Alpenbild im Vergleich zum Basis-Ubuntu-Bild viel kleiner ist.

Ein Dockerfile könnte so aussehen:

FROM node:Alpine

ARG ENVIRONMENT
ARG PORT

RUN mkdir /consumer_portal \
    && npm install -g express path

COPY . /consumer_portal
WORKDIR /consumer_portal

RUN npm cache clean \
    && npm install

EXPOSE $PORT

CMD [ "node",  "server.js" ]

Es ist fast das gleiche und sollte wie erwartet funktionieren. Die meisten Befehle aus Ihrem Ubuntu-Image können auf die gleiche Weise im Alpine-Image angewendet werden.

Wenn ich Scheindaten hinzufüge, um ein ähnliches Projekt wie Sie zu erstellen, wird ein Ubuntu-Image mit einer Größe von 491 MB erstellt, und die Alpine-Version ist nur 62,5 MB groß:

REPOSITORY   TAG       IMAGE ID        CREATED          SIZE
alpinefoo    latest    8ca6f338475e    5 minutes ago    62.5MB
ubuntufoo    latest    38620a1bd5a6    6 minutes ago    491MB
5
n2o

Versuchen Sie, alle Anweisungen für RUN zusammen zu packen. Dadurch wird die Anzahl der Zwischenbilder verringert. (Aber es wird nicht die Größe reduzieren).

Durch Hinzufügen von rm -rf /var/lib/apt/lists/* nach apt-get update wird die Bildgröße reduziert, indem alle unnötigen apt-get-Elemente entfernt werden.

Sie können auch vim aus Ihrem Image in der letzten RUN-Anweisung entfernen.

FROM ubuntu

ARG ENVIRONMENT
ARG PORT

RUN apt-get update \
    && apt-get install -y build-essential nodejs npm nodejs-legacy vim \
    && rm -rf /var/lib/apt/lists/* \
    && mkdir /consumer_portal

ADD . /consumer_portal
WORKDIR /consumer_portal

RUN npm install -g express \
    && npm install -g path \
    && npm cache clean \
    && npm install

EXPOSE $PORT

ENTRYPOINT [ "node",  "server.js" ]
CMD [ $PORT, $ENVIRONMENT ]
2
Anthony Raymond

1) Ein Wechsel zu Alpine ist wahrscheinlich die beste Wahl. Ich habe gerade eine Ubuntu Docker-Datei nach Alpine portiert und bin von 1,5 GB auf 585 MB gewechselt. Ich folgte diesen Anweisungen . Beachte, dass du apk anstelle von apt-get verwendest und die Alpine-Paketnamen etwas anders sind.

2) Es ist auch möglich, Ebenen durch Zusammenführen von Ausführungsbefehlen zu verkleinern (jeder neue Ausführungsbefehl erstellt eine neue Ebene).

RUN apt-get update -qq && apt-get install -y build-essential nodejs npm nodejs-legacy vim
RUN npm install -g express path && npm cache clean && npm install

3) Möglicherweise interessieren Sie sich auch für Mehrstufige Erstellung wobei Sie nur die erforderlichen Komponenten in das endgültige Image kopieren.

1
jorfus

Wenn Sie auf Ubuntu basieren, ist dies ein kluger Schachzug

RUN apt-get update && apt-get install -y \
    build-essential \
    cwhatever-you-want \
    vim \
 && rm -rf /var/lib/apt/lists/*

Die letzte Zeile wird viel löschen :) Sie sollten apt-get update immer in derselben Zeile ausführen, da es sonst zwischengespeichert und bei den nächsten Builds nicht ausgelöst wird, wenn Sie eine weitere zu installierende Bibliothek hinzufügen.

0
barat

Erwägen Sie Folgendes: Verwenden Sie einen --no-install-recommends, wenn apt-get Pakete installiert. Dies führt zu einer kleineren Bildgröße. Weitere Informationen finden Sie in diesem Blogeintrag

In einem guten Blog erfahren Sie, wie Sie die Bildgröße in wenigen Schritten reduzieren können.

Tipps zum Verringern der Docker-Bildgröße https://hackernoon.com/tips-to-reduce-docker-image-sizes-876095da3b34

0
sendon1982

Die Bildgröße eines Containers ist ein Problem, das ordnungsgemäß behoben werden sollte.

Einige schlagen vor, die alpline -Distribution zu verwenden, um Platz zu sparen.

Dies ist im Prinzip ein guter Vorschlag, da es ein nodejs image für Alpine gibt, das zur Verwendung bereit ist.

Aber hier muss man vorsichtig sein, denn man muss alle Binaries bauen. Sogar _node_modules_ enthalten normalerweise nur Javascript-Pakete. In einigen Fällen müssen Binärdateien erstellt werden.

Wenn Ihre Docker-Datei gerade funktioniert, sollte dies nicht der Fall sein. Wenn Sie jedoch von einem ubuntu zu einem anderen Image wechseln, sollten Sie sich vor Augen halten, dass alle benötigten Binärdateien vorhanden sind zukünftig müssen sie in einem alpinen image zusammengestellt werden.

Sie sollten überlegen, wie Sie Ihr Bild verwenden, bevor Sie auswählen, wo Sie die Größe zuschneiden möchten.

Ist Ihre Anwendung eine einzelne Anwendung, die alleine in einem eigenen Container lebt und keine andere Node-App hat?

Falls die Antwort "Nein" lautet, sollten Sie beachten, dass die Größe der einzelnen Bilder in der lokalen Docker-Registrierung nicht als Zusammenfassung gezählt wird, um die insgesamt verwendete Größe zu erhalten.

Stattdessen müssen Sie jedes Bild in die Grundebenen aufteilen und jede einzelne Ebene summieren.

Was ich hier meine ist, dass das einzelne Image nicht so wichtig ist, wenn Sie viele Knoten-Apps haben, die auf einem Knoten ausgeführt werden.

Sie können Speicherplatz sparen, indem Sie _node_modules_ freigeben und als Volume exportieren, das alle erforderlichen Abhängigkeiten enthält.

Oder besser, Sie können von einem offiziellen nodejs image ausgehen, um ein Zwischenbild zu erstellen, das die Wurzel der Abhängigkeiten Ihrer Apps enthält. Zum Beispiel expressjs und path . Installieren Sie dann in jedem Anwendungsimage die dedizierten Abhängigkeiten.

Auf diese Weise erhalten Sie den Vorteil, dass Sie die Ebenen gemeinsam nutzen und die Gesamtgröße der lokalen Docker-Registrierung reduzieren können.

Kleinere Überlegungen

Sie müssen express und path nicht global in einem Container-Image installieren.

Benötigen Sie wirklich vim in einem Container? Bedenken Sie, dass das Ändern eines Containers selbst in der Entwicklung nicht sicher ist. Sie können das Volume verwenden, um auf Ressourcen in Ihrem Server-Dateisystem zu verweisen. Oder kopieren Sie beim Ausführen eine Datei oder einen Ordner aus Ihrem Container. Und wenn Sie nur etwas lesen müssen, verwenden Sie einfach Befehle wie less, more oder cat.

0
Mario Santini