2014-09-24 16 views
5

mit möchte ich Caching/Schichtung von Docker Bilder nutzen, Bandbreite, Speicherplatz zu sparen, und Zeit investiert.Aktualisieren Docker Bilder mit kleinen Änderungen Commits

Lassen Sie sagen:

  • Ich habe eine Web-App-Docker Image installiert und in mehrere Docker Hosts im Einsatz.
  • Das Docker-Image enthält den Quellcode meiner Web-App.
  • Ich arbeitete an dem Code und jetzt haben Sie eine neue Version des Codes.

Wie soll ich die Schaffung ein neues Docker oben letzte Bild nur die Bugfix enthalten begehen automatisieren?

Mein Ziel ist es, dass nur das kleine Bugfix diff erforderlich sein wird, zum Download die neuen Bilder für Docker Hosts zu erhalten, die bereits zum vorherigen Bild heruntergeladen.

Dies ist der sate meiner aktuellen Reflexion über sie:

  • Ich werde wahrscheinlich irgendwie mit docker commit beenden Aktualisierung im Bild zu speichern.
  • Aber Wie kann ich auf den Bildinhalt zugreifen?
  • Und selbst dann, wie würde ich meine Änderungen importieren, ohne die Original-Docker Bilder mit verschiedenen Werkzeugen unübersichtlich (git und Shell-Skripte), die nichts mit dazu dient, das Web-App zu tun?.
  • Ich habe mir Volumen angeschaut, um den Code mit einem anderen Docker zu teilen, der sich um die Aktualisierung kümmern würde. Aber Volumes werden nicht festgelegt.

Vielen Dank für einen Einblick, wie Sie dies erreichen können!

EDIT: Die Verwendung mehrerer Dockerfile scheint einen anderen Weg, dies zu tun, thx http://jpetazzo.github.io/2013/12/01/docker-python-pip-requirements/ für die ähnliche Bedenken. Es scheint, dass ich meine Dockerfiles im laufenden Betrieb erzeugen muss.

+0

Wie fügen Sie Ihren Code zum Bild hinzu? – Behe

+0

@Behe Ich verstehe deine Frage nicht, wie ich gesagt habe, dass das ein Teil meines Problems ist. Wenn es bei Ihrer Frage darum geht, den Code an erster Stelle hinzuzufügen (vor der Aktualisierung der App), dachte ich darüber nach, ADD in automatisierten Builds zu verwenden, wie in http://dockerfile.github.io/#/python-runtime. – vaab

+0

Wenn Sie eine Dockerfile verwenden und den Befehl ADD an das Ende setzen, sollte sie den Cache treffen, bis der geänderte Inhalt hinzugefügt wurde, und dann eine neue Ebene für den neuen Inhalt erstellen. Klingt das hilfreich? – Behe

Antwort

2

Hier ist, wie mit docker commit ein vorhandenes Bild zu aktualisieren.

  1. Start einen Behälter mit dem Bild, das Sie ändern mögen:

    docker run -t -i IMAGE /bin/bash 
    

    Beachten Sie, dass Sie wahrscheinlich einige Host-Dateien wollen werden für den Zugriff auf/Verzeichnis Änderungen im Container importieren:

    docker run -t -i -v /host/location:/mnt/share IMAGE /bin/bash 
    

    beenden Sie mit Strg-D oder exit. Wenn Sie dies in einem Skript automatisieren möchten, müssen Sie die ID des Containers für den nächsten Schritt abrufen.Und Sie werden direkt Befehle statt Aufruf eine interaktive Sitzung von bash ausgegeben werden soll:

    container_id=$(docker run -d -v /host/location:/mnt/share IMAGE /bin/bash -c " 
         ## any bash code 
         rsync -av --delete --exclude .git /mnt/share /my/app/ 
         cd /my/app 
         ./autogen.sh 
        ") 
    
  2. Ihre modifizierte Container-Dateisystem als neues Bild Commit:

    docker commit CONTAINER_ID IMAGE_NAME 
    

    Hinweis: Sie wünschen könnte Verwenden Sie denselben IMAGE_NAME wie den, den Sie zuvor gestartet haben den Container mit. Dies wird Ihr Bild effektiv aktualisieren.

Zusätzliche Bedenken:

  • Alle auf einem früheren Bild durch Modifikation sollten versuchen, die neue Ebene auf letzte Bild geschaffen zu minimieren. Die Regeln hängen wahrscheinlich davon ab, ob Sie BTRFS verwenden (Änderungen auf Blockebene befinden sich tatsächlich in der 'Schicht') oder AUFS (Änderungen auf Dateiebene). Das beste wäre es, zu vermeiden, ganze Quelldateien durch die gleichen Dateien zu ersetzen (vermeiden Sie cp -a, git checkout-index, favor rsync oder git checkout).

  • Sie müssen einige Tools auf Ihrer VM installieren, damit Sie Ihre Updates vornehmen können (wahrscheinlich git, rsync ...). Vergessen Sie aber nicht, dass Sie dank des eingehängten Host-Volumes auch Skripte (oder sogar komplette Tools) bereitstellen können.

  • Das erstellte Bild ist nicht orthodox und stammt nicht von Dockerfile. Sie sollten wahrscheinlich ein ganz neues Bild ganz regelmäßig von einem offiziellen Dockerfile wiederherstellen. Oder versuchen Sie zumindest, die Schichtung zu minimieren, indem Sie alle Ihre Bilder direkt auf einem offiziellen Bild basieren lassen.

Verwandte Themen