2014-08-30 2 views
6

Ich habe eine ~ 300Mb gezippte lokale Datei, die ich einem Docker-Image hinzufüge. Der nächste Zustand extrahiert dann das Bild.Docker, wie man eine Datei HINZUFÜGT, ohne sie an ein Bild zu übergeben?

Das Problem besteht darin, dass die ADD-Anweisung zu einem Commit führt, das zu einer neuen Dateisystemschicht führt, die das Image ~ 300 MB größer als erforderlich macht.

ADD /files/apache-stratos.zip /opt/apache-stratos.zip 
RUN unzip -q apache-stratos.zip && \ 
    rm apache-stratos.zip && \ 
    mv apache-stratos-* apache-stratos 

Frage: Gibt es eine Behelfslösung lokale Dateien hinzufügen, ohne ein Commit verursacht?

Eine Option ist eine einfache Web-Server (zB python -m SimpleHTTPServer) auszuführen, bevor die Docker bauen, starten und dann wget die Datei abzurufen verwenden, aber das scheint ein bisschen chaotisch:

RUN wget http://localhost:8000/apache-stratos.zip && \ 
    unzip -q apache-stratos.zip && \ 
    rm apache-stratos.zip && \ 
    mv apache-stratos-* apache-stratos 

Eine weitere Möglichkeit ist Extrahiere die gezippte Datei beim Start des Containers anstatt der Build-Zeit, aber ich würde es vorziehen, den Start so schnell wie möglich zu halten.

Antwort

13

Wenn Sie eine Archivdatei vom lokalen Dateisystem (keine URL) an ADD in der Dockerdatei übergeben (mit einem Zielpfad, keinem Pfad + Dateiname), wird die Datei in das angegebene Verzeichnis dekomprimiert .

Wenn < src> ist ein lokales tar-Archiv in einem anerkannten Kompressionsformat (Identität, gzip, bzip2 oder XZ), dann wird es als ein Verzeichnis entpackt. Ressourcen von Remote-URLs werden nicht dekomprimiert. Wenn ein Verzeichnis kopiert oder ausgepackt, es das gleiche Verhalten wie Teer -x hat: Das Ergebnis ist die Vereinigung von:

1) Was auch immer am Zielpfad existiert und 2) Der Inhalt des Quellbaumes, mit Konflikten zugunsten von "2" gelöst. auf einer Datei-für-Datei-Basis.

Versuch:

ADD /files/apache-stratos.zip /opt/ 

und sehen, ob die Dateien vorhanden sind, ohne weitere Dekompression.

+8

Es scheint nicht 'ZIP-Datei auf Docker 1.2.0 dekomprimieren. –

+0

"Wenn [src] ein lokales tar-Archiv in einem erkannten Komprimierungsformat (identity, gzip, bzip2 oder xz) ist, wird es als Verzeichnis entpackt." –

+0

Die Tatsache, dass ADD keine Unterstützung für '.zip'-Dateien bietet, scheint eine beabsichtigte Entscheidung zu sein: https://github.com/docker/docker/issues/15036 – jap1968

2

Sie können docker-squash verwenden, um neu erstellte Layer zu zerquetschen. Das sollte die Bildgröße deutlich reduzieren.

Leider sind die erwähnten Problemumgehungen (RUN curl ... && unzip ... & rm ..., entpacken bei Containerstart) die einzigen Optionen im Moment (Docker 1.11).

Verwandte Themen