Wie update-code aus Git, um einen Docker-container
Habe ich ein Docker-Datei versucht zu implementieren Django-code in einen container
FROM ubuntu:latest
MAINTAINER { myname }
#RUN echo "deb http://archive.ubuntu.com/ubuntu/$(lsb_release -sc) main universe" >> /etc/apt/sou$
RUN apt-get update
RUN DEBIAN_FRONTEND=noninteractive apt-get install -y tar git curl dialog wget net-tools nano buil$
RUN DEBIAN_FRONTEND=noninteractive apt-get install -y python python-dev python-distribute python-p$
RUN mkdir /opt/app
WORKDIR /opt/app
#Pull Code
RUN git clone git@bitbucket.org/{user}/{repo}
RUN pip install -r website/requirements.txt
#EXPOSE = ["8000"]
CMD python website/manage.py runserver 0.0.0.0:8000
Und dann Baue ich meinen code als docker build -t dockerhubaccount/demo:v1 .
, und dies zieht mein code von Bitbucket auf den container. Ich betreibe es als docker run -p 8000:8080 -td felixcheruiyot/demo:v1
und die Dinge scheinen gut zu funktionieren.
Nun will ich den code aktualisieren, ich.e da habe ich git clone ...
habe ich diese Verwirrung:
- Wie kann ich update mein code, wenn ich die neuen commits und auf Docker-Container bauen Sie Schiffe, mit dem neuen code (Hinweis: wenn ich erstellen es nicht zu Holen, weil der cache).
- Was ist der beste workflow für diese Art von Ansatz?
Du musst angemeldet sein, um einen Kommentar abzugeben.
Gibt es ein paar Ansätze, die Sie verwenden können.
docker build --no-cache
zu vermeiden, mit den cache-Speicher des Git clone.git pull
. Also anstatt zu laufenpython manage.py
, Sie hätten so etwas wieCMD cd /repo && git pull && python manage.py
oder verwenden Sie ein start-Skript, wenn die Dinge komplexer werden.Ich Neige dazu, lieber 2. Sie können auch einen cron-job zu aktualisieren Sie den code in Ihrem container, aber das ist ein wenig mehr Arbeit und geht etwas gegen die Docker-Philosophie.
docker exec -it con/tainer bash
- laufenbash
statt, was angegeben ist inCMD
. Mir scheint, dass beide Optionen sind ziemlich sub-optimal, und diese muss sein sehr häufiges problem - ich habe das Gefühl, es sollte eine Möglichkeit zum deaktivieren der cache in der Mitte desDockerfile
.Ich würde empfehlen, Sie zur Kasse gehen, den code auf dem host-und dem
COPY
es in der Bild. So wird es aktualisiert, wenn Sie eine änderung vornehmen. Auch während der Entwicklung, die Sie binden können, montieren Sie das source-Verzeichnis über die code-Verzeichnis im container, d.h. alle änderungen werden sofort in den container.Andockfenster Befehl für git-Repositorys, der überprüft, ob das Letzte update wäre sehr hilfreich wenn!
Andere Lösung.
Docker build-Befehl verwendet cache, solange eine Anweisung-Zeichenfolge ist genau das gleiche wie die, die man von Cache-Bild. Also, wenn Sie schreiben,
Bei der nächsten Aktualisierung ändern Sie wie folgt.
Dies kann verhindert, dass docker aus mit cache.
Möchte ich Ihnen eine andere Lösung. Ich muss warnen jedoch, dass es definitiv nicht die "Andockfenster Weg", Dinge zu tun und stützt sich auf die Existenz von Mengen (das könnte einen potenziellen blocker-tools wie Docker Swarm und Kubernetes)
Dem Grundsatz, dass werden wir nutzen, ist die Tatsache, dass die Inhalte von container-Verzeichnisse, die verwendet werden, als Andockfenster Bände, tatsächlich gespeichert in der Datei-system des host. Check-out diese Teil der Dokumentation.
In Ihrem Fall würden Sie machen
/opt/app
Andockfenster Volumen. Sie nicht brauchen, um Karte das Volumen explizit auf einen Speicherort auf dem host-Datei-system, da werde ich unten beschreiben, die Zuordnung kann erhalten werden, dynamisch.Also für den Anfang lassen Sie Ihre Dockerfile genau so, wie es ist, und schalten Sie Ihren container Schöpfung Befehl zu so etwas wie:
Den Befehl
docker inspect -f {{index .Volumes "/opt/webapp"}} some-name
drucken wird die gesamte Datei-system-Pfad auf dem host, auf dem der code gespeichert (diese ist, wo ich abgeholt den inspect-trick).Bewaffnet mit diesem wissen alles, was Sie tun müssen ist, ersetzen Sie den code ein und fertig.
Also ein sehr einfaches script "deploy" wäre so etwas wie:
Vorteile, die Sie erhalten, mit einem Ansatz wie diesem:
UPDATE
Können Sie die gleichen Ergebnisse erzielen, die ich oben erwähnt habe mit Andockfenster cp (ab Andockfenster 1.8). Auf diese Weise werden die container müssen nicht Bände, und Sie können ersetzen Sie code in die Behälter, wie Sie auf die host-Datei-system.
Natürlich, wie ich bereits erwähnt in den Beginn der Antwort, dies ist nicht das "Andockfenster Weg", Dinge zu tun, die die Befürworter Behälter wird unveränderlich und reproduzierbar.
Wenn Sie GitHub können Sie die GitHub-API, um nicht cache-spezifischen Befehle AUSZUFÜHREN.
Müssen Sie haben jq installiert parse JSON:
apt-get install -y jq
Beispiel:
Im Dockerfile (ARG-Befehl sollte richtig sein, bevor Sie AUSGEFÜHRT werden):
Oder wenn Sie nicht installieren möchten jq:
Wenn ein repository neue commits
git clone
ausgeführt werden.ADD
haben diedocker build
download der aktuellen KOPF-ref aus der API zu jeder Zeit. Dann, wenn der KOPF ändert sich der cache invalidiert. stackoverflow.com/questions/36996046/...