Der Einstiegspunkt für einen Andock-Container teilt dem Andock-Dämon mit, was ausgeführt werden soll, wenn Sie diesen spezifischen Container "ausführen" möchten. Stellen wir uns die Frage "Was sollte der Container beim zweiten Start?" oder "Was sollte der Container nach dem Neustart ausführen?"
Wahrscheinlich folgen Sie dem gleichen Ansatz, den Sie mit "Old-School" Provisioning-Mechanismen machen. Dein Skript "installiert" die benötigten Skripte und du wirst deine App als Systemstart-Dienst starten, richtig? Wenn Sie das tun, sollten Sie das in eine "dockerisierte" Definition ändern.
Der Einstiegspunkt für diesen Container sollte ein Skript sein, das Ihre App tatsächlich startet, anstatt Dinge einzurichten. Angenommen, Sie benötigen Java installiert, um Ihre App ausführen zu können. So in der dockerfile legen Sie den Grundbehälter bis zu installieren, alle Dinge, die Sie brauchen, wie:
FROM alpine:edge
RUN apk --update upgrade && apk add openjdk8-jre-base
RUN mkdir -p /opt/your_app/ && adduser -HD userapp
ADD target/your_app.jar /opt/your_app/your-app.jar
ADD scripts/init.sh /opt/your_app/init.sh
USER userapp
EXPOSE 8081
CMD ["/bin/bash", "/opt/your_app/init.sh"]
Unsere Container, in der Firma für die ich arbeite, bevor die eigentliche App im init.sh Skript laufen sie holen die configs from consul (anstatt einen Bereitstellungspunkt bereitzustellen und die Konfigurationen innerhalb des Hosts zu platzieren oder sie in den Container zu integrieren). So wird das Skript in etwa so aussehen:
#!/bin/bash
echo "Downloading config from consul..."
confd -onetime -backend consul -node $CONSUL_URL -prefix /cfgs/$CONSUL_APP/$CONSUL_ENV_NAME
echo "Launching your-app..."
java -jar /opt/your_app/your-app.jar
Ein Rat, den ich Ihnen geben kann, ist (in meiner wirklich kurzen Erfahrung mit Containern arbeitet) behandelt Ihre Container, als ob sie staatenlos waren, sobald sie bereitgestellt werden (alle Befehle, die Sie ausführen vor dem Einstiegspunkt).
Stimmen Sie vollkommen überein, Container staatenlos zu betrachten. Wenn Daten initialisiert werden sollen, legen Sie sie in ein Volume. – BMitch
Ich würde wirklich gerne Ihrem Rat folgen, aber es ist nicht so einfach. Ich habe sehr wenig Einfluss auf Änderungen der App und es musste geändert werden, um es so zu verwenden, wie Sie es beschrieben haben. Beispiel: Bei jedem Start eines Containers richtet das init-Skript eine Datenbank für die App ein. Dies sollte nicht passieren, wenn der Container neu gestartet wird, da er die bereits vorhandenen Daten überschreibt ... Leider hat es sich als sehr schwierig herausgestellt, den Entwicklern der App beizubringen, wie man docker verwendet. Also versuche ich es extrem einfach für sie zu halten. – christian
Wie läuft das? – StarWind0