Befehl ausführen im Docker-Container nur auf den ersten start
Habe ich ein Docker-Image, die ein Skript verwendet (/bin/bash /init.sh
) als Entrypoint. Ich möchte das Skript nur beim ersten start eines Containers. Es sollte weggelassen werden, wenn der Container neu gestartet wird oder gestartet wurde wieder nach einem Absturz des docker-daemon.
Gibt es eine Möglichkeit, dies zu tun mit docker selbst, oder tun, wenn mit der Umsetzung einiger Art des check in das script?
Du musst angemeldet sein, um einen Kommentar abzugeben.
Den Einstiegspunkt für einen docker-container erzählt die docker-daemon, was zu laufen, wenn Sie wollen, um zu "laufen", dass bestimmte container. Fragen Sie doch mal die Fragen, "was die container sollten ausgeführt werden, wenn es begann die zweite Zeit?" oder "was sollte der Behälter führen Sie nach dem Neustart?"
Wohl, was Sie tun, ist die nach der gleichen Methode, die Sie tun, mit "old-school" - provisioning-Mechanismen. Ihr Skript "installieren" die benötigten Skripte und führen Sie Ihre app als systemd/upstart-Dienst, richtig? Wenn Sie das tun, sollten Sie ändern in eine "dockerized" definition.
Den Einstiegspunkt für diese Behälter ist ein Skript, das eigentlich startet die app, anstatt die Dinge. Lassen Sie uns sagen, dass Sie müssen java installiert haben, um in der Lage zu führen Sie Ihre app aus. Also im dockerfile richten Sie das Basis-container zu installieren, all die Dinge, die Sie benötigen, wie:
Unserer Container bei der Firma in der ich arbeite, vor dem ausführen der eigentlichen app in der init.sh Skript, Sie Holen sich die configs von Konsul (statt mount-Punkt und Ort der configs innerhalb der host oder embedded diese in den container). Also das script wird ungefähr so Aussehen:
Einen Rat, den ich dir geben kann, ist (in meiner kurzen Erfahrung arbeiten mit Behälter) behandeln Sie Ihre Container, als ob Sie waren staatenlos, sobald Sie bereitgestellt sind (alle Befehle, die Sie ausführen, bevor Sie den Eintrag Punkt).
Ich hatte das gleiche Problem, hier ein einfaches Verfahren (d.h. Behelfslösung), um es zu lösen:
Schritt 1:
Erstellen "myStartupScript.sh" das Skript, die diesen code enthält:
Schritt 2:
Ersetzen Sie die Zeile "# YOUR_JUST_ONCE_LOGIC_HERE" mit dem code, den Sie wollen, werden nur das erste mal ausgeführt wird der Behälter begann
Schritt 3:
Set das scritpt als entrypoint Ihrer Dockerfile:
In der Zusammenfassung, die Logik ist ganz einfach, es prüft ob eine bestimmte Datei im filesystem; wenn nicht, er schafft es und führt Ihre nur-einmal-code. Das nächste mal, wenn Sie starten Sie Ihren container die Datei in das Dateisystem so, dass der code nicht ausgeführt wird.
Wollte ich das gleiche auf windows-container. Es kann erreicht werden mit dem task-scheduler unter windows. Linux-äquivalent für den Taskplaner cron. Können Sie, wie in Ihrem Fall. Dazu Bearbeiten Sie die dockerfile und fügen Sie die folgende Zeile am Ende
Dadurch wird eine Aufgabe mit dem Namen myTask läuft es ONSTART und die Aufgabe seiner selbst ist, zum ausführen eines powershell-Skript platziert "c:\app\myTask.ps1".
Diese myTask.ps1-Skript tun, was die Initialisierung, die Sie tun müssen, um auf die container zu starten. Stellen Sie sicher, dass Sie diese Aufgabe löschen, sobald es ausgeführt wird, erfolgreich oder aber es läuft bei jedem Start. Um es zu löschen, können Sie verwenden Sie den folgenden Befehl am Ende der myTask.ps1-Skript.
Ich zu tun hatte und ich endete damit, ein
docker run -d
die soeben eine freistehende container und begannbash
(im hintergrund) gefolgt von einemdocker exec
, dass die notwendigen Initialisierung. hier ist ein BeispielWenn ich jetzt starten Sie in meinem container kann ich nur tun
Dies ist vielleicht nicht ideal, aber funktioniert gut für mich.